Node.js从入门到放弃(五)
前言sessionrequire模块加载机制模块加载的路径规则require模块加载的路径查找
前言
这是该系列文章的第五篇,主要介绍express中session的使用和Node.js中require的模块加载机制
session
session和cookie都是客户端和服务端通信的一种手段,可存储数据。cookie存储在客户端,安全性较低,session存储在服务端,安全性较高。下面以express-session为例,介绍一下session的简单使用
项目初始化
- 新建项目文件夹express-dev(可自定义)
- 进入项目后,命令行输入npm init -y
- 安装依赖: npm i express express-session
app.js
根目录新建app.js,并写入如下内容const express = require("express")const session = require("express-session")const router = require("./router")const app = express();//session配置 一定要放在路由挂载前app.use(session({ secret: 'lengyuexin',//配置加密字符串(在原有加密基础上加密) resave: false,//官方推荐配置 saveUninitialized: false,//官方推荐配置 cookie: { maxAge: 60000,//cookie存活时长 60s httpOnly: true//设置后无法通过document.cookie获取,防止js劫持 }}))//路由配置app.use(router)app.listen(3000, () => { console.log('run server--------')}) router.js
根目录新建router.js,并写入如下内容const express = require("express");const router = express.Router();router.get('/', (req, res) => { //访问session中存储的数据 if (req.session.isLogin) { res.send('欢迎:' + req.session.name); } else { res.send('登录过期或尚未登录'); }})router.get('/login', (req, res) => { //使用session存储数据 req.session.name = "冷月心"; req.session.isLogin = true; res.send('登录成功');})router.get('/exit', (req, res) => { //销毁session req.session.destroy(() => { res.send('已退出登录'); })})module.exports = router 测试逻辑
未登录状态或登录过期,访问首页/,显示登录过期或尚未登录
地址栏输入/login,跳转到登录页,显示登录成功,在session中存储信息
再次访问首页/,显示欢迎信息
访问退出页面/exit,显示已退出登录,销毁session
再次访问首页/,显示登录过期或尚未登录
require模块加载机制
我们常使用require加载某个模块(或文件),但也许并没有在意细节上的东西,下面介绍模块加载的路径规则和加载时候的路径查找机制。
模块加载的路径规则
- 模块导入的时候,层级路径不可省略./(当前目录),../(上级目录)等标志性路径
- 支持当前文件模块所属磁盘根路径访问,但几乎不用(/xxx)
- node内置支持的拓展名可省略,.js文件 .node文件 .json文件
- 除内置拓展名外,其他拓展名被当作js文件处理
- 为了提高查找效率,.js以外的文件,都应该加上拓展名
- 不论如何查找,最终对应的基本上都是一个文件
require模块加载的路径查找
- 上边提到的路径规则就是针对自定义的文件模块的路径查找,这个时候,即使是当前模块./也不能省略。
- 下面介绍内置模块和通过npm安装的第三方模块的路径查找机制
内置模块(也称核心模块)
核心模块文件已经被编译到二进制文件中,按名字加载即可,且核心模块的加载速度是最快的
第三方模块
第三方模块的加载机制是最为复杂的,有很多查找规则,以查找express为例
const express=require("express")
- 先去根目录查找node_modules 目录
- 进入后查找express文件夹,此时目录为node_modules/express
- 查找package.json文件,此时目录为node_modules/express/package.json
- 查找package.json文件中的main属性,该属性会指定文件入口,对应某个文件
- 注意,package.json和其中的main属性,都未必一定存在(express就没有main属性)
- 即便package.json文件中的main属性存在,对应的文件拓展名也未必正确,会走一个拓展名分析的流程
- 若package.json文件和其中的main属性不存在或main属性指定的文件名错误,依次查找index.js、index.json、index.node
- 若以上规则都查找一次,还没有找到,就报错
优先缓存加载
为了提高模块加载效率,在上述的加载机制和路径规则基础上,还有一个规则,优先从缓存加载,举个例子
app.jsrequire("./a")require("./b") a.jsconsole.log("a被加载了")require("./b") b.jsconsole.log("b被加载了") 执行 node app.js ,b被加载了只会被输出一次,因为a中已经加载过
|