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.filenamemodule.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




















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)