当你在代码里写下如下代码时:
import { createStore } from 'vuex';
// 或者是
const { createStore } = require('vuex')
两种语句引入的是同一个文件吗?区别在哪? 会对程序产生什么差别吗? 或许能回答出 "前者是 ESM 语法,后者是 CommonJS 语法。",然后呢?
然后,需要先了解几个知识点: 从 node 14.x 版本开始,package.json 里支持了 exports 属性,当它存在时,它的优先级最高。
// 这说明无论是 import 还是 require 都只会以 `main.js` 作为入口
"exports": "main.js"
// 以下则可以给 `require` 和 `import` 分别设置入口
"exports": {
"import": "es/index.js",
"require": "cjs/index.js"
}
当 exports 属性不存在,而 module 属性存在时,构建工具(如 webpack、rollup)会把 module 属性作为 ESM 的入口来使用。 因此,如果 package.json 文件里有:
name: "yy",
module: "lib/index.js",
在 webpack/rollup 项目中:
import xx from 'yy';
入口会被指向 node_modules/yy/lib/index.js
如果 exports 和 module 都不存在,则 package.json 中的 main 属性会成为指定入口的唯一属性