本文主要是介绍NodeJS模块的导入导出,包文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1 导入模块
- 1.1 加载模块作用
- 1.2加载规则
- 1.2.1 从缓存中加载
- 1.2.2 判断模块标识
- 1.2.3 加载文件和目录
- 1.2.3.1 加载文件
- 1.2.3.2 加载目录
- 2 导出模块
- 2.1 导出多个成员(必须在对象中)
- 2.2 导出单个成员(函数,字符串)
- 2.3 exports 和 module.exports 的区别
- 2.3.1 相同点
- 2.3.2 不同点
- 2.3.3 总结
- 3 包说明文件
- 3.1 package.json文件
- 3.2 package-lock.json文件
1 导入模块
var 自定义变量名 = require('模块');
1.1 加载模块作用
- 核心模块,三方模块,自定义模块
- 执行被加载模块中的代码
- 得到被加载模块中的
exports
导出接口对象
1.2加载规则
- 优先从缓存中加载
- 核心模块
- 路径形式的文件模块
- 第三方模块
1.2.1 从缓存中加载
例如:main.js
,优先从缓存加载,由于 在 a
中已经加载过 b
了,所以 这里不会重复加载
,可以拿到其中的接口对象,但是不会重复执行里面的代码, 这样做的目的是为了避免重复加载,提高模块加载效率
require('./a.js');
var fn = require('./b');
console.log(fn);
a.js
console.log("a.js被加载");
var fn = require('./b');
console.log(fn);
b.js
console.log("b.js被加载");
module.exports=function(){
console.log(fn);
}
1.2.2 判断模块标识
require('模块标识');
- 路径形式的模块
- ./, …/,/xxx
- 带盘符的绝对路径
- 核心模块
- 核心模块的本质也是文件
- 但是文件被编译到二进制文件中了,可直接使用
- 第三方模块
- 凡是第三方模块都必须通过
npm
的方式来下载 - 使用的时候就可以通过
require('包名')
的方式来进行加载才可以 使用 - 既不是核心模块,也不算路径形式模块
以模板引擎模块art-template
为例来说明加载规则
:
先找到当前文件所处目录中的
node_modules
目录
然后node_modules/art-template
最后找到node_modules/art-template/package.json
文件中的main
属性
然后main
属性,记录了art-template
的入口模块
如果package.json
文件不存在或者没有main
属性,那么就加载默认备选项index.js
1.2.3 加载文件和目录
1.2.3.1 加载文件
require
命令用于加载文件,后缀名默认为.js
var foo = require('foo');
// 等同于
var foo = require('foo.js');
根据参数的不同格式,require
命令去不同路径寻找模块文件。
- 如果参数字符串以
“/”
开头,则表示加载的是一个位于绝对路径
的模块文件。比如,require('/home/marco/foo.js')
将加载/home/marco/foo.js
- 如果参数字符串以
“./”
开头,则表示加载的是一个位于相对路径
(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')
将加载当前脚本同一目录的circle.js
。 - 如果参数字符串不以
“./“或”/“
开头,则表示加载的是一个默认提供的核心模块
(位于Node的系统安装目录中),或者一个位于各级node_modules
目录的已安装模块(全局安装或局部安装)。
举例来说,脚本/home/user/projects/foo.js
执行了require('bar.js')
命令,Node
会依次搜索以下文件。
- /usr/local/lib/node/bar.js
- /home/user/projects/node_modules/bar.js
- /home/user/node_modules/bar.js
- /home/node_modules/bar.js
- /node_modules/bar.js
这样设计的目的是,使得不同的模块可以将所依赖的模块本地化
- 如果参数字符串不以
“./“或”/“
开头,而且是一个路径,比如require('example-module/path/to/file')
,则将先找到example-module
的位置,然后再以它为参数,找到后续路径。 - 如果指定的模块文件没有发现,
Node
会尝试为文件名添加.js、.json、.node
后,再去搜索。.js
件会以文本格式的JavaScript
脚本文件解析,.json
文件会以JSON
格式的文本文件解析,.node
文件会以编译后的二进制文件解析。 - 如果想得到
require
命令加载的确切文件名,使用require.resolve()
方法。
1.2.3.2 加载目录
通常,我们会把相关的文件会放在一个目录里面,便于组织。这时,最好为该目录设置一个入口文件,让require
方法可以通过这个入口文件,加载整个目录。
在目录中放置一个package.json
文件,并且将入口文件写入main
字段。下面是一个例子。
// package.json
{ "name" : "some-library","main" : "./lib/some-library.js"
}
require
发现参数字符串指向一个目录以后,会自动查看该目录的package.json
文件,然后加载main
字段指定的入口文件
。如果package.json
文件没有main字段
,或者根本就没有package.json文件
,则会加载该目录下的index.js文件或index.node文件
。
如果没有package.json
文件那么加载规则则是:
将 X
当成目录,依次查找下面文件,只要其中有一个存在,就返回该文件,不再继续执行:
- X/package.json(main字段)
- X/index.js
- X/index.json
- X/index.node
2 导出模块
node
中是模块作用域,默认文件中所有的成员只在当前文件模块有效- 对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到
exports
接口对象中就可以导出多个成员
2.1 导出多个成员(必须在对象中)
exports.a = 123;
exports.b ='hello';
exports.c=function(){console.log('ccc');
}
2.2 导出单个成员(函数,字符串)
module.exports='hello';
以下情况会覆盖
module.exports='hello';
//下面的会覆盖之前的hello
module.exports=function(x,y){return x+y;
}
2.3 exports 和 module.exports 的区别
2.3.1 相同点
- 在
node
中,每个模块中都有一个module
对象 module
对象中有一个exports
对象(默认是空对象
)- 我们可以把需要导出的成员都挂载到
module.exports
接口对象中,也就是:moudle.exports.xxx = xxx
的方式 - 但是每次都
moudle.exports.xxx = xxx
很麻烦 - 所以
Node
为了方便,同时在每一个模块中都提供了一个成员叫:exports
exports === module.exports
结果为true
- 所以对于:
moudle.exports.xxx = xxx
的方式 完全可以:expots.xxx = xxx
2.3.2 不同点
- 当一个模块需要导出单个成员的时候,这个时候必须使用:
module.exports = xxx
的方式 - 不要使用
exports = xxx
, 因为这样不管用 - 因为 每个模块最终向外
return
的是module.exports
- 而
exports
只是module.exports
的一个引用 - 所以即便为
exports = xx
重新赋值,也不会影响module.exports
- 但是有一种赋值方式比较特殊:
exports = module.exports
这个用来重新建立引用关系的,而和之前的exports
就没有关系了
2.3.3 总结
exports只是一个module.exports的引用
,尽量不要破坏他们之间的引用关系就好了
3 包说明文件
NodeJS中的package.json和package-lock.json文件说明
3.1 package.json文件
package.json
文件记录项目中所需要的所有模块。 当执行npm install
的时候,node
会先从package.json
文件中读取所有dependencies
信息,然后根据dependencies
中的信息与node_modules
中的模块进行对比, 没有的直接下载,已有的检查更新
另外,package.json
文件只记录通过npm install
方式安装的模块信息,而这些模块所依赖的其他子模块的信息不会记录。
npm init
命令生成包描述文件,在dos
窗口里面 必须切换到要安装的目录,就会安装在那里
傻瓜式一路next
,如下图:
包说明文件
{"name": "feed_back","version": "1.0.0","description": "留言板项目","main": "app.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "jingzh","license": "ISC","dependencies": {"jquery": "^3.4.1"}
}
3.2 package-lock.json文件
- 这个是在
npm 5
以前是不会有package-lock.json
,在5
之后才加入了这个文件 package-lock.json
是当安装包,node_modules 或 package.json
发生变化时自动生成的文件。- 在
npm5
之后的版本不需要添加— — save
,它就会自动保存这个依赖信息 - 这个文件主要功能是确定当前安装的包的依赖,以便后续重新安装的时候 生成相同的依赖 ,而忽略项目开发过程中有些依赖已经发生的更新。
package-lock.json
文件锁定所有模块的版本号,包括主模块和所有依赖子模块。当执行npm install的时候,node从package.json文件读取模块名称,从package-lock.json文件中获取版本号
,然后进行下载或者更新
这篇关于NodeJS模块的导入导出,包文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!