Node.js:模块

在Node.js中一个JS文件即为一个模块,由于JS文件可以存放在不同位置,所以会出现多种导入模块的方式。

模块暴露

首先给出即将被导入的模块,该JS文件名为:Utils.js

1
2
3
4
5
exports.print = function() {
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i])
}
}

还有另外一种暴露的方式

1
2
3
4
5
module.exports.print = function() {
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i])
}
}

以上两种方式目前在使用上没有任何区别,使用require()方法导入模块时实际返回的是exports,所以使用时需要采用连点的方式调用

第二种暴露方式可以进一步简化

1
2
3
4
5
module.exports = function() {
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i])
}
}

采用这种方式在导入该模块时,由于目前exports已经被我们指向了一个匿名函数,所以require()返回的就是我们定义的函数可以直接调用

导入模块

相对路径

在主程序中可以使用相对路径的方式导入模块,假如我们把上面的模块文件放在主程序同一目录下的common文件夹时,可以采用如下的方式导入

1
2
3
4
# 可以省略.js
var util = require("./common/Utils.js")

util.print("Hello", "World")

注: 在Node.js中有一个特殊属性 __dirname 可以指向当前目录

1
2
3
4
// 可以省略.js后缀
var util = require(__dirnme + "/common/Utils.js")

util.print("Hello", "World")

会不会觉得上面导入模块的代码很长,其实可以进一步缩短导入模块的语句,只需在common文件夹下给定一个 package.json 文件即可

1
2
3
{
"main": "Utils.js"
}

接下来修改主程序

1
2
3
var util = require(__dirnme + "/common")

util.print("Hello", "World")

可以看出来package.json可以为我们指定入口模块,该文件的完整写法很长可以通过npm命令帮我们生成,只需在common目录下执行如下命令即可

1
npm init

也可以不给package.json文件,只需把Utils.js改名即为index.js即可,Node.js会默认认为index.js即为模块的入口

模块常规存放位置

现在怎么看怎么觉得导入模块时的相对路径不爽,接下来让我们把相对路径去掉,我们首先在主程序所在目录下新建一个 node_modules 目录,然后把Utils.js文件拷贝进去然后修改主程序

1
2
3
4
// 可以省略.js后缀
var util = require("Utils.js")

util.print("Hello", "World")

是不是觉得清爽多了,接下来在node_modules目录下新建一个common目录,然后把Utils.js文件移进去,然后给出一个package.json文件指定入口

1
2
3
var util = require("common")

util.print("Hello", "World")

我们再来破坏一下,把common目录下的package.json删除并把Utils.js改名为index.js,程序也能正常运行。

模块的搜寻顺序: 先找主程序当前目录下的node_modules,如果找不到接着找上级目录下的node_modules,一直搜寻到顶层目录下的node_modules还没找到的话,最后去环境变量 NODE_PATH 下去搜寻

默认情况下以-g模式安装的包会安装到全局node_modules下,并且不能被require,需要把全局node_modules目录配置进环境变量 NODE_PATH ,如果不想配置环境变量,也可以在当前项目下使用如下命令进行链接

1
npm link express ./node_modules/express -> /usr/local/lib/node_modules/express

注: 底层使用的是软连接,该命令暂不支持Windows

最后补充几点:

  • Node.js在导入模块时也会把模块文件执行一遍
  • Node.js会先找主程序所在目录node_modules文件夹下的模块,如果找不到则去全局node_modules文件夹下去找,如果还找不到则会报错。
  • require()不会重复加载模块,也就是说无论调用多少次require()获得的模块都是同一个
  • 核心模块拥有最高的加载优先级,如果有模块与其命名冲突,Node.js总是会加载核心模块

npm常用命令

下载

下载NPM包

1
npm install 包名

默认情况下包会下载在当前目录的node_modules文件夹下

该命令还有两个常用的参数:

  • –save: 下载包的时候同时把依赖信息写入本项目的package.json文件中
  • -g: 将包安装到全局

查看

查看已安装的包

1
2
3
npm ls

npm list

默认是查看本项目中安装的模块,如果加 -g 参数可以查看全局安装的模块

卸载

卸载已安装的包

1
npm uninstall 包名

默认情况下卸载当前目录下的node_modules中的模块,使用 -g 参数可以卸载全局模块

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/08/node-module.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。