Node.js中文网
本文仅用于学习记录,不存在任何商业用途,如侵删
Node.js 具有内置的模块系统。
Node.js 文件可以导入其他 Node.js 文件公开的功能。
当想要导入某些东西时,使用
const library = require('./library')
当然这是CommonJS的用法
可以导入存在于当前文件夹中的 library.js
文件中公开的功能。
在此文件中,必须先公开功能,然后其他文件才能将其导入。
默认情况下,文件中定义的任何其他对象或变量都是私有的,不会公开给外界。
这就是 module
系统提供的 module.exports
API 可以做的事。
当将对象或函数赋值为新的 exports
属性时,这就是要被公开的内容,因此,可以将其导入应用程序的其他部分或其他应用程序中。
可以通过两种方式进行操作。
【1】第一种方式是将对象赋值给 module.exports
(这是模块系统提供的对象),这会使文件只导出该对象:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car
//在另一个文件中
const car = require('./car')
这是 CommonJS的模块加载方式。
【2】第二种方式是将要导出的对象添加为 exports
的属性。这种方式可以导出多个对象、函数或数据:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
exports.car = car
或直接
exports.car = {
brand: 'Ford',
model: 'Fiesta'
}
在另一个文件中,则通过引用导入的属性来使用它:
const items = require('./items')
items.car
或者
const car = require('./items').car
module.exports
【对象】和export
【属性】之间有什么区别?前者公开了它指向的对象。 后者公开了它指向的对象的属性。
这里笔者补充一点吧【这是ES入门中阮一峰老师的解释】
JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS。
CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用
require()
和module.exports
,ES6 模块使用import
和export
。它们采用不同的加载方案。从 Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持。
Node.js 要求 ES6 模块采用
.mjs
后缀文件名。也就是说,只要脚本文件里面使用import
或者export
命令,那么就必须采用.mjs
后缀名。Node.js 遇到.mjs
文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"
。如果不希望将后缀名改成
.mjs
,可以在项目的package.json
文件中,指定type
字段为module
。{ "type": "module" }
- 1
- 2
- 3
一旦设置了以后,该项目的 JS 脚本,就被解释成 ES6 模块。
# 解释成 ES6 模块 $ node my-app.js
- 1
- 2
如果这时还要使用 CommonJS 模块,那么需要将 CommonJS 脚本的后缀名都改成
.cjs
。如果没有type
字段,或者type
字段为commonjs
,则.js
脚本会被解释成 CommonJS 模块。总结为一句话:
.mjs
文件总是以 ES6 模块加载,.cjs
文件总是以 CommonJS 模块加载,.js
文件的加载取决于package.json
里面type
字段的设置。注意,ES6 模块与 CommonJS 模块尽量不要混用。
require
命令不能加载.mjs
文件,会报错,只有import
命令才可以加载.mjs
文件。反过来,.mjs
文件里面也不能使用require
命令,必须使用import
。