判断是否是程序的入口文件有两种方式
- require.main === module(推荐)
- module.parent === null
exports 和 module.exports 的区别
- module.exports 初始值为一个空对象 {}
- exports 是指向的 module.exports 的引用
- require() 返回的是 module.exports 而不是 exports
设置环境变量
- Mac 和 Linux
NODE_ENV=test node app
- Windows
set NODE_ENV=test
node app
- 通用方式
// 全局
npm i cross-env -g
cross-env NODE_ENV=test node app
// 非全局,修改package.json,npm start方式启动
npm i cross-env
{
"scripts": {
"start": "cross-env NODE_ENV=production node app"
}
}
语义化版本(semver)
semver 格式:主版本号.次版本号.修订号
- 主版本号:做了不兼容的 API 修改
- 次版本号:做了向下兼容的功能性新增
- 修订号:做了向下兼容的 bug 修正
npm init
npm init 有智能的默认选项,比如从根目录名称推断模块名称,通过 ~/.npmrc 读取你的信息,用你的 Git 设置来确定 repository 等等。
锁定版本
npm i express --save --save-exact (安装 express,同时将 "express": "4.14.0" 写入 dependencies )
运行npm config set save-exact true
这样每次 npm i xxx --save 的时候会锁定依赖的版本号,相当于加了 --save-exact 参数。
小提示:npm config set 命令将配置写到了 ~/.npmrc 文件,运行 npm config list 查看。
npm scripts
npm 的 scripts 有一些内置的缩写命令,如常用的:
- npm start 等价于 npm run start
- npm test 等价于 npm run test
npm shrinkwrap
为了彻底锁定依赖的版本,让应用在任何机器上安装的都是同样版本的模块(不管嵌套多少层),通过运行 npm shrinkwrap,会在当前目录下产生一个 npm-shrinkwrap.json,里面包含了通过 node_modules 计算出的模块的依赖树及版本。
只要目录下有 npm-shrinkwrap.json 则运行 npm install 的时候会优先使用 npm-shrinkwrap.json 进行安装,没有则使用 package.json 进行安装。
会话
cookie 与 session 的区别
- cookie 存储在浏览器(有大小限制),session 存储在服务端(没有大小限制)
- 通常 session 的实现是基于 cookie 的,即 session id 存储于 cookie 中
通过引入 express-session 中间件实现对会话的支持:
app.use(session(options))
session 中间件会在 req 上添加 session 对象,即 req.session 初始值为 {},当我们登录后设置 req.session.user = 用户信息,返回浏览器的头信息中会带上 set-cookie 将 session id 写到浏览器 cookie 中,那么该用户下次请求时,通过带上来的 cookie 中的 session id 我们就可以查找到该用户,并将用户信息保存到 req.session.user。