cjs、es6-modules

本文深入解析了AMD、CommonJS、UMD、CMD和ES6等模块加载机制的特点和使用方式,对比了它们之间的异同,涵盖了依赖加载、同步与异步处理及导入导出规则等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识~ 模块都会只加载一次,被缓存起来 

AMD:Asynchronous Module Definition

 1、依赖前置:先加载所有依赖,然后依赖注入

// define、require都可以依赖模块
// 先加载所有依赖的模块,顺序是随机的,只要加载完就行
// 例如a、b,b依赖a,结果b先加载完了,就凉凉
// 好像有个shim选项可以解决。。。我错过了这个时代,就不深入研究了

// ab.js
define(['a','b'],function(a,b){ // 使用define定义模块,return内容
    return {
      ab:{a,b},
    };
});

// main.js
require(['ab'],function(ab){
    console.log(ab);
});

CommonJS,
例如NodeJS,可以省略文件后缀名,有默认加载机制,https://nodejs.org/api/modules.html#modules_all_together

1、同步加载

// src/a.js
console.log(1,'a.js'); // 只执行一次
module.exports = function a(){}; // 默认导出
exports.name = 'a.js'; // 导出多个

// src/b.js
const a = require('./a');
console.log(a);
const {name:aName} = require('./a');
console.log(a,aName);

UMD:Universal Module Definition

AMD与CommonJS的混合

(function (window, factory) {
    if (typeof exports === 'object') {
     
        module.exports = factory(); // jQuery
    } else if (typeof define === 'function' && define.amd) {
     
        define(factory);
    } else {
     
        window.jQuery = factory(); // jQuery
    }
})(this, function () {
    const jQuery = {};
    return jQuery;
});

CMD:Common Module Definition

1、依赖懒加载,用什么加载什么,有点CommonJS的感觉了

2、同步加载

// require同步加载
define(function(require,exports,module){
 const a = require('./a');
 console.log(a);
 let b = null;
 if(!!a){
  b = require('./b')
  console.log(b);
 }
 exports.ab = {a,b};
 module.exports = function(){
   console.log(a,b);
 };
});

 

ES6,类似更优雅的CommonJS

1、导入必须与导出对应(或者理解为有导入,必须有对应的导出)

// src/a.js
// 空文件,没有默认导出,也没有其它导出

// src/b.js
import a from './a'; // The requested module does not provide an export named 'default'
import {name} from './a'; // The requested module does not provide an export named 'name'

// 使用babel的情况下,每个文件都当成了一个对象
// a = {} 
// name = undefined 

2、同步加载,并且import都会被提升到文件顶部,只能在文件根部使用,

     类似const常量,但没有临时性死区,是因为被提升到文件顶部了吧

if(1){
  // 不在文件根部使用
  import {name} from './a.js'; // 词法错误 Unexpected token {
}
// src/a.js
 console.log(1, 'a.js');
 export default function() {};
 export const name = 'a.js';

// src/index.html
 console.log(a); 
 import a from './a.js';
 console.log('!!'); 
 console.log(name); 
 import {name} from './a.js'; // 被提升到文件顶部
 a = null; // 分配给常量变量 Assignment to constant variable. 

 

 

对了,require也支持CommonJS那种写法了,看起来和CMD语法完全一样,https://www.douban.com/note/283566440/ 

但是执行结果不同:我感觉requireJS内部可能对回调函数执行了toString(),提前了所有的require()

 

// 就像这样
define(function(require, exports, module) {
    console.log('require module: main');

    var mod1 = require('./mod1');
    mod1.hello();
    var mod2 = require('./mod2');
    mod2.hello();

    return {
        hello: function() {
            console.log('hello main');
        }
    };
});

 

 

我vue项目启动的时候报如下错误如何解决: ERROR Failed to compile with 394 errors 14:21:17 These dependencies were not found: * core-js/modules/es6.array.fill in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.array.find in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/components/InputTable/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/index/RightComponents/Calculate.vue?vue&type=script&lang=js& and 4 others * core-js/modules/es6.array.find-index in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Ge nerator/components/InputTable/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/index/Home.vue?vue&type=script&lang=js& and 7 others * core-js/modules/es6.array.from in ./src/utils/index.js * core-js/modules/es6.array.sort in ./src/components/bus-extents/map/geotool.js, ./src/mixins/generator/index.js and 8 others * core-js/modules/es6.function.name in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Gener ator/components/Upload/UploadImg.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/index/DraggableItem.vue?vue&type=script&lang=js& and 43 others * core-js/modules/es6.map in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/basic/dynamicModel/list/detail/index.vue?vue&type=script&lang=js&, ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.math.sign in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.math.trunc in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.number.constructor in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/ Generator/components/Calculate/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/components/InputTable/index.vue?vue&type=script&lang=js& and 26 others * core-js/modules/es6.number.is-finite in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.number.is-integer in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.number.is-nan in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/components/InputTable/index.vue?vue&type=script&lang=js&, ./src/components/Generator/utils/index.js and 1 other * core-js/modules/es6.number.parse-float in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.object.freeze in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.object.keys in ./src/main.js, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/index/Home.vue?vue&type=script&lang=js& and 8 others * core-js/modules/es6.regexp.constructor in ./src/components/Generator/render/render.js, ./src/components/Generator/utils/index.js and 3 others * core-js/modules/es6.regexp.flags in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.regexp.match in ./src/utils/index.js, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/bus/app/appDown.vue?vue&type=script&lang=js& and 1 other * core-js/modules/es6.regexp.replace in ./src/api/workFlow/workFlowForm.js, ./src/components/Generator/render/render.js and 34 others * core-js/modules/es6.regexp.search in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Heade rSearch/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/JNPF-iconBox/index.vue?vue&type=script&lang=js& and 36 others * core-js/modules/es6.regexp.split in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Genera tor/components/Calculate/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/index/RightPanel.vue?vue&type=script&lang=js& and 38 others * core-js/modules/es6.regexp.to-string in ./src/components/Generator/utils/index.js, ./src/filters/index.js and 16 others * core-js/modules/es6.set in ./src/utils/index.js, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/permission/authorize/index.vue?vue&type=script&lang=js& * core-js/modules/es6.string.includes in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Col umnDesign/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/components/InputTable/index.vue?vue&type=script&lang=js& and 14 others * core-js/modules/es6.string.iterator in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/bus-extents/print/PrintView.vue?vue&type=script&lang=js&, ./src/utils/index.js and 5 others * core-js/modules/es6.symbol in ./src/views/bus/track/js/jquery-3.3.1.min.js * core-js/modules/es6.typed.float64-array in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.typed.int32-array in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.typed.int8-array in ./src/views/bus/track/js/turf.min.js * core-js/modules/es6.typed.uint32-array in ./src/views/bus/track/js/turf.min.js * core-js/modules/es7.array.includes in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Colu mnDesign/index.vue?vue&type=script&lang=js&, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/Generator/components/InputTable/index.vue?vue&type=script&lang=js& and 17 others * core-js/modules/es7.string.pad-start in ./src/utils/index.js, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/bus/askLeave/Detail.vue?vue&type=script&lang=js& and 6 others * core-js/modules/es7.symbol.async-iterator in ./src/views/bus/track/js/jquery-3.3.1.min.js * core-js/modules/web.dom.iterable in ./src/main.js, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/ColumnDesign/index.vue?vue&type=script&lang=js& and 71 others To install them, you can run: npm install --save core-js/modules/es6.array.fill core-js/modules/es6.array.find core-js/modules/es6.array.find-index core-js/modules/es6.array.from core-js/modules/es6.array.sort core-js/modules/es6.function.name core-js/modules/es6.map core-js/modules/es6.math.sign core-js/modules/es6.math.trunc core-js/modules/es6.number.constructor core-js/modules/es6.number.is-finite core-js/modules/es6.number.is-integer core-js/modules/es6.number.is-nan core-js/mod ules/es6.number.parse-float core-js/modules/es6.object.freeze core-js/modules/es6.object.keys core-js/modules/es6.regexp.constructor core-js/modules/es6.regexp.flags core-js/modules/es6.regexp.match core-js/modules/es6.regexp.replace core-js/mo dules/es6.regexp.search core-js/modules/es6.regexp.split core-js/modules/es6.regexp.to-string core-js/modules/es6.set core-js/modules/es6.string.includes core-js/modules/es6.string.iterator core-js/modules/es6.symbol core-js/modules/es6.typed.f loat64-array core-js/modules/es6.typed.int32-array core-js/modules/es6.typed.int8-array core-js/modules/es6.typed.uint32-array core-js/modules/es7.array.includes core-js/modules/es7.string.pad-start core-js/modules/es7.symbol.async-iterator core-js/modules/web.dom.iterable Failed to resolve loader: core-js/modules/es6.function.name' in 'D:\Development\project\lh\linhai-boot-web\src\components\SimpleUploader You may need to install it.
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值