模块化方案:CommonJs & ESModule

CommonJs (cjs)

  • cjs 是 Node 的模块化规范,使用 require & exports 进行导入导出

  • cjs 可作用于 node 环境 & webpack 环境,但不可作用浏览器

  • 如果前端项目在 webpack 中,也可以理解为浏览器和 Node 都支持

    有些模块只支持 cjs,比如 ms,但并不影响它在前端项目中使用 ( 通过 webpack )
    但是,如果通过 cdn 的方式直接在浏览器中引入,则会出问题

/* cjs1.js */
module.exports = 10; // 导出一个数值
console.log("cjs1.js");

/* cjs2.js */
const num = require("./cjs1"); // 导入数据
console.log("cjs1", num); // cjs1 10
  • cjs 为动态加载,可通过变量 require 数据
require(`./${a}`);

详细介绍见:CommonJs



ESModule (esm)

  • esm 是 ES6 的模块化规范,使用 import & export 进行导入导出
  • Node浏览器均支持 esm
/* esm1.js */
export let age = 18;
console.log("esm1.js");

/* esm2.js */
import { age } from "./esm1.js";
console.log(age); // 18
  • esm 为静态导入,可在编译期进行 Tree Shaking,减少 js 体积
  • 正因 esm 为静态导入,不能通过变量 import 数组
// 报错
import { 'f' + 'oo' } from 'my_module'; // 不能使用 [表达式] 接收导入数据

// 报错
let module = 'my_module';
import { foo } from module; // 不能使用 [变量] 作为被导入文件的路径

// 报错:不能在语句内进行导入
if (true)
    import { foo } from 'module1';
  • 如需动态导入,esm 也可使用 import("./module.js") 进行导入

详细介绍见:ESModule



cjs & esm

  1. cjs 输出的是值的拷贝esm 输出的是值的引用
    ∴ 数据源更新后,esm 导出的数据也会被更新

  2. cjs运行时加载,esm编译时加载
    ∴ esm 的导入语句 import 会自动提升

  3. cjs动态加载,esm静态加载
    ∴ esm 不可以通过变量导入数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JS.Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值