美文网首页
ESM与Commonjs的差异

ESM与Commonjs的差异

作者: Mr无愧于心 | 来源:发表于2022-04-26 18:17 被阅读0次
  1. CommonJS 模块输出的是一个值的拷贝,ESM输出的是值的引用。
  2. CommonJS 模块是运行时加载,ESM是编译时输出接口。
  3. CommonJS 模块的require()是同步加载模块,ESM的import命令是异步加载,有一个独立的模块依赖的解析阶段。

ESM的import存在提升,且变量像const的 是只读的。

CommonJS 模块输出的是值的拷贝,ESM输出的是值的引用

CommonJS一旦输出一个值,模块内部的变化就影响不到这个值
ESM是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块

//commonjs

// lib.js
var counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};
// main.js
var mod = require('./lib');

console.log(mod.counter);  // 3
mod.incCounter();
console.log(mod.counter); // 3
//----------------------------------------------------
//ESM
// lib.js
export let counter = 3;
export function incCounter() {
  counter++;
}

// main.js
import { counter, incCounter } from './lib';
console.log(counter); // 3
incCounter();
console.log(counter); // 4
//-------------------------------------

//ESM只是一个“符号连接”,这个变量是只读的,对它进行重新赋值会报错。类似于 const 的特性
counter=1 // TypeError

CommonJS 模块是运行时加载,ESM是编译时输出接口

CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ESM不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。

// ESM的import命令具有提升效果,会提升到整个模块的头
foo();
import { foo } from 'my_module';
//以上代码不会报错,因为import命令是编译阶段执行的,在代码运行之前。

Commonjs模块加载ESM模块

CommonJS 的require()命令不能加载 ES6 模块,会报错,只能使用import()这个方法加载。

(async () => {
  await import('./my-app.mjs');
})();

require()不支持 ES6 模块的一个原因是,它是同步加载,而 ES6 模块内部可以使用顶层await命令,导致无法被同步加载。

ESM模块加载Commonjs模块

只能整体加载,不能只加载单一的输出项

// 正确
import packageMain from 'commonjs-package';

// 报错
import { method } from 'commonjs-package';

因为 ES6 模块需要支持静态代码分析,而 CommonJS 模块的输出接口是module.exports,是一个对象,无法被静态分析,所以只能整体加载

相关文章

  • ESM与Commonjs的差异

    CommonJS 模块输出的是一个值的拷贝,ESM输出的是值的引用。 CommonJS 模块是运行时加载,ESM是...

  • CommonJs 与 ESM

    ES Modules 特性 自动采用严格模式,忽略 'user strict' 每个 ES Module 都是运行...

  • CommonJs & AMD & CMD & ESM

    CommonJs CommonJs 规定每个 js 文件都能被看作是一个模块, 其内部定义的变量是私有的, 不会对...

  • es6

    esm和commonjs规范的区别 1、esm是引用赋值,并且是编译时加载。模块内部引用的变化,会反应在外部 一个...

  • 2-1、模块化

    一、JS模块化 (1)命名空间 (2)CommonJS (3)AMD (4)CMD (5)UMD (5)ESM (...

  • AMD CommonJS 和 UMD

    在 ESM 之前,前端常用的模块规范有 AMD,CommonJS 以及 UMD,其中 AMD 是浏览器端的 Jav...

  • Webpack 如何解析模块路径

    你一定见过这些导入方式,无论是 ESM 还是 CommonJS 模块,或是其他模块规范。 那么 webpack 是...

  • 如何理解webpack中的loader概念

    抛弃commonjs规范不提,webpack通过分析入口文件中esm的导入语法进行递归文件寻找,众所周知导入js时...

  • node 环境下一个文件如何同时支持 import 和 requ

    JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 ...

  • 模块规范:AMD、CMD、ESM 、CommonJS

    前言 对前端模块化规范做的一点笔记 什么是模块化? 或根据功能、或根据数据、或根据业务,将一个大程序拆分成互相依赖...

网友评论

      本文标题:ESM与Commonjs的差异

      本文链接:https://www.haomeiwen.com/subject/xxogertx.html