【青训营】 – Node 基础:Node介绍、模块化介绍(一)

Node.js 是什么

Node.js官网介绍中可以看到

Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。

因此,我们就能明白,Node.js(后面简称为 Node)并不是一个独立的编译JS啥的编译器,仅仅是个能跑在服务端的跨平台JS运行环境。

Node 模块化

Node是属于CommonJS模块化规范,因为定制ESM模块化规范晚于NodeCommonJS模块化实现,因此导致了早期一段时间内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处理的方式不同。

小结一下

  1. 模块化应用的不同
    • CommonJS暴露的模块进行require返回的是整个值的拷贝
    • ESM暴露的模块进行import返回的是整个值的引用
  2. 注入变量不同
    • CommonJS会注入一些变量
    • ESM则只会注入import
  3. 导入时的支持不同
    • CommonJS支持导入JSON文件以及省略当前文件夹其他模块的.js后缀。
    • ESM不支持导入JSON且不能省略.js后缀

可能还有其他地方的差异,不过这儿就不过多介绍了。

结语

这篇文章主要是简单的介绍一下Node是什么以及Node模块化的一些知识点。搭建一个Node的基础知识框架。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享