UNPKG

tbom

Version:

Taobao Open Platform Modules

75 lines (64 loc) 2.48 kB
'use strict'; 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;