当你使用依赖时,导入的具体是哪个文件?

126 阅读1分钟

当你在代码里写下如下代码时:

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 属性会成为指定入口的唯一属性