0%

JS各种模块引用

各种引用方式

CJS,AMD,UMD,ESM

CJS

CommonJs

1
2
3
4
5
6
7
//importing 
const doSomething = require('./doSomething.js');

//exporting
module.exports = function doSomething(n) {
// do something
}
  • 常用于node
  • 引入模块是同步的
  • 使用CJS引入会得到被引入对象的拷贝
  • 不能用于浏览器

AMD

Asynchronous Module Definition

1
2
3
4
5
6
7
8
9
10
11
define(['dep1', 'dep2'], function (dep1, dep2) {
//Define the module value by returning a value.
return function () {};
});

// "simplified CommonJS wrapping" https://requirejs.org/docs/whyamd.html
define(function (require) {
var dep1 = require('dep1'),
dep2 = require('dep2');
return function () {};
});
  • 异步引入模块
  • 为了前端使用而提出的
  • 不如CJS简便

UMD

Universal Module Definition

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define(["jquery", "underscore"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"), require("underscore"));
} else {
root.Requester = factory(root.$, root._);
}
}(this, function ($, _) {
// this is where I defined my module implementation

var Requester = { // ... };

return Requester;
}));
  • 前后端均能用
  • CJS和·AMD不同,UMD更像是一种配置几种模块引用的模式。更多模式
  • UMD通常被用作打包工具的回调模块

ESM

ES Modules,Javascipt 提出的标准的模块系统

1
2
3
4
5
6
7
8
9
10
11
import React from 'react';

import {foo, bar} from './myLib';

...

export default function() {
// your Function
};
export const function1() {...};
export const function2() {...};

总结

  • ESM是最好用的,它语法简单,异步加载并且支持tree-shake
  • UMD可以运行在任何环境,并且如果ESM不支持的话可以用于回调
  • CJS同步加载对后端友好
  • AMD异步加载对前端友好

参考