AMD CMD CJM ESM模块转换

  1. 这些兼容是写法上的兼容,即在不改变以前依赖requieJs或者seaJs下模块的抒写方式,
  2. 利用webpack之后即可去掉这些依赖却不用修改写法,也支持混用
  3. 转换都是JS的模块化函数写法

module、exprots(webpack_exports)、webpack_require来自runtime的webpackBootstrap

以下转换只考虑target: web的情况(webpack版本 4.4.1)

import和require的加载转换

import和require都转换为__webpack__require

混用加载模块是可行的 Input


import CMDModule from './module/CMDModule';
import ESMModule from './module/ESMModule';
const AMDModule = require('./module/AMDModule');
const CJMModule = require('./module/CJMModule');
console.log('page4.js run');

Output

/***/ "./src/page4.js":
/*!**********************!*\
  !*** ./src/page4.js ***!
  \**********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";

//这里定义{esModule: true}
__webpack_require__.r(__webpack_exports__);

//用import语法载入非esm模块会补充default属性,去兼容import方法得到的对象
/* harmony import */ var _module_CMDModule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./module/CMDModule */ "./src/module/CMDModule.js");
/* harmony import */ var _module_CMDModule__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_module_CMDModule__WEBPACK_IMPORTED_MODULE_0__);

//普通的esm直接require
/* harmony import */ var _module_ESMModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./module/ESMModule */ "./src/module/ESMModule.js");


//require非esm模块
const AMDModule = __webpack_require__(/*! ./module/AMDModule */ "./src/module/AMDModule.js");
const CJMModule = __webpack_require__(/*! ./module/CJMModule */ "./src/module/CJMModule.js");
console.log('page4.js run');

ESM

目前最常用的es模块转化(webpack2.x以上才支持)


/***/ "./src/module/ESMModule.js":
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
//会对exports加入{__esMoudle: true}
__webpack_require__.r(__webpack_exports__);

//直接webpack__require去引用即可
/* harmony import */ var components_bar_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! components/bar.js */ "./src/component/bar.js");

//export defaulth会放入到webpack_exports的default中,这里区别于别的转换是exports,所以esm混合转换会导致exports是undefined的
/* harmony default export */ __webpack_exports__["default"] = (a = 2);

/***/ }),

AMD

Input

define(['react'],function (React) {
    console.log('AMDModule.js');
})

Output

/***/ "./src/module/AMDModule.js":

/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;


//通过__webpack__require去加载define中的模块,保存到array中
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! react */ "./node_modules/react/index.js")],

//以exports作为执行对象,调用回调函数,将依赖模块作为数组传入
__WEBPACK_AMD_DEFINE_RESULT__ = (function (React) {
    console.log('123');
}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),

//将结果赋值给module.exports
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

/***/ })

CMD

Input

define(function (require,exports ,module) {
    console.log('CMD');
    const defaultFunction = ()=>{
        console.log('run default');
    }
    exports.data = defaultFunction;
})

Output

/***/ "./src/module/CMDModule.js":

/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
var __WEBPACK_AMD_DEFINE_RESULT__;

//对比AMD这里就没有define array了,而是将require和exports和module传入进去传入进去

!(__WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, module) {
    console.log('CMD');
    var defaultFunction = function defaultFunction() {
        console.log('run default');
    };
    exports.data = defaultFunction;
}).call(exports, __webpack_require__, exports, module),


//将结果赋值给module.exports
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

/***/ }),

CommonJS

常见常见babel会转为CJM,然后webpack再转换(webpack2.x之前无法识别import的esm就会这么做)

Input

exports.data = ()=>{
    console.log('CJMModule');
};

Output


/***/ "./src/module/CJMModule.js":
/*! no static exports found */

//这里转化非常简单,直接将exports带入即可,import都会转为webpackrequire
/***/ (function(module, exports, __webpack_require__) {

"use strict";
exports.data = function () {
    console.log('CJMModule');
};

/***/ }),

UMD只是兼容写法,不会转换

results matching ""

    No results matching ""