Node.js 是什么
在Node.js
官网介绍中可以看到
Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。
因此,我们就能明白,Node.js
(后面简称为 Node)并不是一个独立的编译JS
啥的编译器,仅仅是个能跑在服务端的跨平台JS
运行环境。
Node 模块化
Node
是属于CommonJS
模块化规范,因为定制ESM
模块化规范晚于Node
的CommonJS
模块化实现,因此导致了早期一段时间内Node
是不支持ESM
的,如今当然也是能够支持ESM
模块化了。
Node
因为运行在服务端,所以会内置一些变量(如当前文件路径),而新增功能(如文件操作,路径操作)需用通过模块引用进行操作。
Node(CommonJS) 提供的变量
Node
运行时注入的变量大概是这样的,具体可以通过文档查看。
function module(__filename, __dirname, require, module, exports) {
// 写的代码
module.export = { xxx: 'name' }
// 内置的返回
return module.exports
}
复制代码
__filename
:当前文件的绝对路径__dirname
:当前文件的文件夹路径require
:导入其他模块时的方法,具有一些方法和属性require.cache
:缓存已加载的模块require.resolve(request)
:返回通过request
解析到的文件地址require.resolve.paths(request)
:返回解析request
时搜索的路径
require.main
:启动Node
程序的入口脚本
module
:一些内置的方法和属性module.exports
:模块最终导出的对象module.children
: 依赖的模块(?, 存疑)module.filename
: 当前文件的绝对路径module.id
: 模块唯一标识符,一般是module.filename
module.loaded
: 标识模块是否加载完成,或正在加载中module.parent
: 解析时的父模块module.paths
: 模块搜索时的路径module.require(id)
: 同require
exports
:module.exports
的别名
废弃的属性/方法在这边就不介绍了
Node(ESM) 提供的变量
没有__filename, __dirname, require, module, exports
,只有import
。
当前文件路径可以通过import.meta.url
获取。
CommonJS 和 ESM 在 Node 的差异
在Node
中默认为CommonJS
模块化代码,因此想要启用ESM
模块化需要:
- 在
package.json
中启用`”type”: “module” - 使用
.mjs
作为文件结尾
不建议混用模块化,因此这里不多过介绍混用情况。
我们先看一个例子,关于CommonJS
:
// counter.js
let count = 3
function addCounter() {
count++
}
module.exports = {
count,
addCounter,
}
// index.js
const { addCounter, count } = require('./counter')
addCounter()
console.log(count) // 3
复制代码
关于ESM
:
// counter.js
export let count = 3
export function addCounter() {
count++
}
// index.js
import { addCounter, count } from './counter.js'
addCounter()
console.log(count) // 4
复制代码
这是一个很经典的例子,可以看到两个的结果不同,那是因为Node
处理的方式不同。
小结一下
- 模块化应用的不同
CommonJS
暴露的模块进行require
返回的是整个值的拷贝ESM
暴露的模块进行import
返回的是整个值的引用
- 注入变量不同
CommonJS
会注入一些变量ESM
则只会注入import
- 导入时的支持不同
CommonJS
支持导入JSON
文件以及省略当前文件夹其他模块的.js
后缀。ESM
不支持导入JSON
且不能省略.js
后缀
可能还有其他地方的差异,不过这儿就不过多介绍了。
结语
这篇文章主要是简单的介绍一下Node
是什么以及Node
模块化的一些知识点。搭建一个Node
的基础知识框架。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END