Files
RentWeAppFront/node_modules/@dcloudio/uni-mp-weixin/lib/independent-plugins/add-share-ability-to-runtime-plugin.js

61 lines
2.9 KiB
JavaScript
Raw Normal View History

2025-11-14 11:39:33 +08:00
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;