爱客仕-前端团队博客园

Nodejs查漏补缺-Modules

在这里记录下nodejs各种小细节

ch1 Modules

作为一个新世纪的前端,npm早已经是我们生活中必不可少的工具了
那么,这其中有多少奇怪的事情呢

1. 全局安装不等于全局require

初学nodejs的时,听闻npm i xxx之后,便可以在项目中直接require使用了
又听闻有一个npm i xxx -g的全局安装命令,下意识以为这样安装之后在任何地方都可以require
其实不然,这个-g的意义更多的在于将nodejs写的命令行工具装在全局
这样就可以直接在命令行使用,而不需要敲全路径了

比如 npm i gulp -g
然后直接在命令行敲 gulp,就能使用它

如果想require全局的包,则需要设置 NODE_PATH 环境变量
指向nodejs全局安装路径的node_modules文件夹
window 目录: %USERPROFILE%\AppData\Roaming\npm\node_modules

2. 为什么要使用module.exports = xxx,而不是 exports = xxx

我们可以使用如下语句导出一个模块

1
2
3
4
5
exports.foo1 = bar1
exports.foo2 = bar2
// or:
module.exports = bar

而不能使用exports = bar
因为nodejs将你的模块文件包裹成

1
2
3
4
(function (exports, require, module, __filename, __dirname) {
//your module
// ...
});

其中exportsmodule.exports的引用
当我们改变exports的属性时,修改的是module.exports内存地址的对象
而当我们直接给exports赋值时,仅仅只是将exports指向的内存地址改变
而不会修改 module.exports的指向

3. 解除modules缓存

我们知道nodejs会自动缓存require的模块,以防止多次require重复加载文件浪费性能
那如果我们的场景需要清除缓存,该怎么做呢?
其实nodejs的模块都缓存在require.cache对象里面,模块的键都是其文件的绝对路径
而通过require.resolve(‘./module/name’)可以获取到模块绝对路径

1
delete require.cache[require.resolve('./module/name')]

就可以删除相对应模块的缓存