JavaScript两种格式的模块

78 阅读1分钟

代码

我们先看这样一段代码

node环境下

math.js

function sum(...args) {
  return args.reduce((pre, value, index) => pre + value,0)
}

export default sum

index.js

import sum from './math.js'
console.log(sum(1, 2, 3));

然后我们运行node index.js

很明显会报错

(node:2832) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)

给的提示是 想要去加载ES module 请在package.json中设置xxx或者使用.mjs文件后缀

解决

1. 仍然使用ES module模块编写

按照它的提示 我们可以把涉及到的文件改成.mjs后缀 运行node index.mjs或者 index.js的同级目录结构下 添加package.json文件 内容为{"type": "module"} 来告诉node我们这些代码用ES module解析 运行node index.js

2. 编写Commonjs模块代码

法一:改写如下

index.js

const math = require('./math.js')
console.log(math.sum(1,2,3))

math.js

function sum(...args) {
  return args.reduce((pre, value) => pre + value,0)
}

module.exports = {
  sum
}

这里我是这样理解的 用math代表模块(math.js文件) math.js文件暴露出来了sum 所以我们用math.sum拿到sum函数

运行node index.js 发现成功 这里也可以添加package.json文件 内容为{"type": "commonjs"} 当然也可以不加 因为node环境下默认使用commonjs模块解析js代码

2.2 我们还可以把涉及到的文件改成.cjs后缀 然后运行node index.cjs

回顾及补充

这里对js的两种模块的相关知识进行一下回顾以及补充 js有两种 一种是 ES6 模块,简称 ESM;另一种是 Node.js 专用的 CommonJS 模块.... 待写

参考文章

Node.js 如何处理 ES6 模块