const { parse } = require('@babel/parser'); const template = require('@babel/template'); const generator = require('@babel/generator'); const traverse = require('@babel/traverse'); const { generateAsset } = require('./utils'); // 【修改】runtime.js => 全局共享 global.webpackJsonP class AddShareAbilityToRuntimePlugin { apply (compiler) { compiler.hooks.emit.tapPromise('AddShareAbilityToRuntimePlugin', compilation => { return new Promise((resolve, reject) => { try { // debugger // 修改 runtime.js const runtimeChunkName = 'common/runtime.js'; const commonRuntimeInfo = compilation.assets[runtimeChunkName]; if (!commonRuntimeInfo) { resolve(); return; } const commonRuntimeStrContent = commonRuntimeInfo.source(); const commonRuntimeAst = parse(commonRuntimeStrContent); traverse.default(commonRuntimeAst, { AssignmentExpression (nodePath) { try { const leftNode = nodePath.node.left; if (leftNode.type === 'MemberExpression' && leftNode.object && leftNode.property) { if (leftNode.object.name === 'global' && leftNode.property.value === 'webpackJsonp') { const insertCode = 'if(global.webpackJsonp){ return };'; const astNode = template.statements(insertCode)(); const blockNode = nodePath.scope.block; blockNode.body.body.unshift(...astNode); nodePath.stop(); } } } catch (e) { console.error('independent.error', 'ShareRuntimeChunkPlugin', e); } }, }); const runtimeSource = generator.default(commonRuntimeAst).code; const runtimeAsset = generateAsset(runtimeSource); compilation.assets[runtimeChunkName] = runtimeAsset; Object.values(process.UNI_SUBPACKAGES).forEach(pkgInfo => { if (pkgInfo.independent) { compilation.assets[`${pkgInfo.root}/${runtimeChunkName}`] = runtimeAsset; } }); resolve(); } catch (e) { console.error('independent.error', 'AddShareAbilityToRuntimePlugin', e); reject(e); } }); }); } } module.exports = AddShareAbilityToRuntimePlugin;