tbom
Version:
Taobao Open Platform Modules
75 lines (64 loc) • 2.48 kB
JavaScript
;
const ConcatSource = require('webpack-sources').ConcatSource;
/**
* webpack plugin - 将 AMD 转化成 CMD 模块(包含冗余星系)
*
* @param {any} options
*/
function AmdPlugin(options) {
this.options = options;
}
AmdPlugin.prototype.apply = function(compiler) {
const modName = `"${this.options.name}"`;
const envType = Object.keys(compiler.options.entry)[0];
compiler.plugin('this-compilation', function(compilation) {
const mainTemplate = compilation.mainTemplate;
compilation.templatesPlugin('render-with-entry', function(source, chunk, hash) {
const externals = chunk.modules.filter(function(m) {
return m.external;
});
let externalsDepsArray = externals.map(function(m) {
return typeof m.request === 'object' ? m.request.amd : m.request;
});
const externalsArguments = externals.map(function(m) {
return '__WEBPACK_EXTERNAL_MODULE_' + m.id + '__';
});
const requires = externalsDepsArray.map(function(mod, index) {
return ' var ' + externalsArguments[index] + ' = require("' + mod + '");\n';
}).join('');
externalsDepsArray = externalsDepsArray.map(function(mod) {
return ' "' + mod + '"';
}).join(',\n');
return new ConcatSource('define(' + modName + ', [\n' + externalsDepsArray +
'\n], function(require, exports, module) {\n\n' + requires +
'\n return module.exports = \n\n', source, '});');
}.bind(this));
compiler.plugin('emit', function(Compilation, callback) {
var assets = Compilation.assets;
for (var name in assets) {
if (!/\.js$/.test(name)) continue;
var source = assets[name].source();
// 代码修正处理函数
Compilation.assets[name].source = function(source) {
return function() {
// amd 去头
source = source.replace(/define[\s\S]+?return\s+?\w\.exports/, 'module.exports');
// amd 去尾
source = source.replace(/\}\);?\}\);?;$/, ';\n');
return source;
};
}(source);
}
callback();
}.bind(this));
mainTemplate.plugin('global-hash-paths', function(paths) {
if (modName) paths.push(modName);
return paths;
}.bind(this));
mainTemplate.plugin('hash', function(hash) {
hash.update('exports amd');
hash.update(modName);
}.bind(this));
}.bind(this));
};
module.exports = AmdPlugin;