162 lines
6.6 KiB
JavaScript
162 lines
6.6 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.wrapperNVueAppStyles = exports.uniEsbuildPlugin = void 0;
|
|
const path_1 = __importDefault(require("path"));
|
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
const debug_1 = __importDefault(require("debug"));
|
|
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
|
const utils_1 = require("../../utils");
|
|
const utils_2 = require("../utils");
|
|
const appCss_1 = require("./appCss");
|
|
const debugEsbuild = (0, debug_1.default)('uni:app-nvue-esbuild');
|
|
const emittedHashMap = new WeakMap();
|
|
function uniEsbuildPlugin({ appService, }) {
|
|
let resolvedConfig;
|
|
let buildOptions;
|
|
const nvueOutputDir = (0, utils_1.nvueOutDir)();
|
|
const outputDir = process.env.UNI_OUTPUT_DIR;
|
|
let isFirst = true;
|
|
return {
|
|
name: 'uni:app-nvue-esbuild',
|
|
enforce: 'post',
|
|
configResolved(config) {
|
|
buildOptions = {
|
|
format: 'iife',
|
|
target: 'es6',
|
|
minify: config.build.minify ? true : false,
|
|
banner: {
|
|
js: `"use weex:vue";
|
|
${uni_cli_shared_1.polyfillCode}`,
|
|
},
|
|
bundle: true,
|
|
write: false,
|
|
plugins: [esbuildGlobalPlugin((0, utils_2.esbuildGlobals)(appService))],
|
|
};
|
|
resolvedConfig = config;
|
|
emittedHashMap.set(resolvedConfig, new Map());
|
|
},
|
|
async writeBundle(_, bundle) {
|
|
const entryPoints = [];
|
|
const assets = [];
|
|
Object.keys(bundle).forEach((name) => {
|
|
const chunk = bundle[name];
|
|
if (chunk.type === 'chunk' &&
|
|
chunk.facadeModuleId &&
|
|
chunk.facadeModuleId.endsWith('.nvue')) {
|
|
entryPoints.push(name);
|
|
}
|
|
else if (chunk.type === 'asset') {
|
|
assets.push(name);
|
|
}
|
|
});
|
|
// 仅 nvueOutputDir 时 copy
|
|
if (!appService) {
|
|
assets.forEach((name) => {
|
|
fs_extra_1.default.copySync(path_1.default.resolve(nvueOutputDir, name), path_1.default.resolve(outputDir, name), { overwrite: false });
|
|
});
|
|
}
|
|
if (!entryPoints.length) {
|
|
return;
|
|
}
|
|
const emittedHash = emittedHashMap.get(resolvedConfig);
|
|
const changedFiles = [];
|
|
if (buildAppCss()) {
|
|
changedFiles.push(uni_cli_shared_1.APP_CONFIG_SERVICE);
|
|
}
|
|
debugEsbuild('start', entryPoints.length, entryPoints);
|
|
for (const filename of entryPoints) {
|
|
await buildNVuePage(filename, buildOptions).then((code) => {
|
|
const outputFileHash = (0, uni_cli_shared_1.hash)(code);
|
|
if (emittedHash.get(filename) !== outputFileHash) {
|
|
changedFiles.push(filename);
|
|
emittedHash.set(filename, outputFileHash);
|
|
return fs_extra_1.default.outputFile(path_1.default.resolve(outputDir, filename), code);
|
|
}
|
|
});
|
|
}
|
|
if (!isFirst && changedFiles.length) {
|
|
process.env[changedFiles.includes(uni_cli_shared_1.APP_CONFIG_SERVICE)
|
|
? 'UNI_APP_CHANGED_FILES'
|
|
: 'UNI_APP_CHANGED_PAGES'] = JSON.stringify(changedFiles);
|
|
}
|
|
debugEsbuild('end');
|
|
isFirst = false;
|
|
},
|
|
};
|
|
}
|
|
exports.uniEsbuildPlugin = uniEsbuildPlugin;
|
|
/**
|
|
* 将 nvue 全局 css 样式注入 app-config-service.js
|
|
* @returns
|
|
*/
|
|
function buildAppCss() {
|
|
const appCssJsFilename = path_1.default.join((0, utils_1.nvueOutDir)(), appCss_1.APP_CSS_JS);
|
|
if (!fs_extra_1.default.existsSync(appCssJsFilename)) {
|
|
return;
|
|
}
|
|
const appCssJsCode = fs_extra_1.default.readFileSync(appCssJsFilename, 'utf8');
|
|
const appCssJsFn = new Function('module', appCssJsCode.replace(`export default`, `module.exports=`));
|
|
const module = { exports: { styles: [] } };
|
|
appCssJsFn(module);
|
|
const appCssJsonCode = JSON.stringify(module.exports.styles);
|
|
if (process.env.UNI_NVUE_APP_STYLES === appCssJsonCode) {
|
|
return;
|
|
}
|
|
process.env.UNI_NVUE_APP_STYLES = appCssJsonCode;
|
|
// 首次 build 时,可能还没生成 app-config-service 的文件,故仅写入环境变量
|
|
const appConfigServiceFilename = path_1.default.join(process.env.UNI_OUTPUT_DIR, uni_cli_shared_1.APP_CONFIG_SERVICE);
|
|
if (!fs_extra_1.default.existsSync(appConfigServiceFilename)) {
|
|
return;
|
|
}
|
|
const appConfigServiceCode = fs_extra_1.default.readFileSync(appConfigServiceFilename, 'utf8');
|
|
fs_extra_1.default.writeFileSync(appConfigServiceFilename, wrapperNVueAppStyles(appConfigServiceCode));
|
|
return true;
|
|
}
|
|
function buildNVuePage(filename, options) {
|
|
return (0, uni_cli_shared_1.transformWithEsbuild)(`import App from './${filename}'
|
|
const webview = plus.webview.currentWebview()
|
|
if(webview){
|
|
const __pageId = parseInt(webview.id)
|
|
const __pagePath = '${(0, uni_cli_shared_1.removeExt)(filename)}'
|
|
let __pageQuery = {}
|
|
try{ __pageQuery = JSON.parse(webview.__query__) }catch(e){}
|
|
App.mpType = 'page'
|
|
const app = Vue.createPageApp(App,{$store:getApp({allowDefault:true}).$store,__pageId,__pagePath,__pageQuery})
|
|
app.provide('__globalStyles', Vue.useCssStyles([...__uniConfig.styles, ...(App.styles||[])]))
|
|
app.mount('#root')
|
|
}`, path_1.default.join((0, utils_1.nvueOutDir)(), 'main.js'), options).then((res) => {
|
|
if (res.outputFiles) {
|
|
return res.outputFiles[0].text;
|
|
}
|
|
return '';
|
|
});
|
|
}
|
|
function esbuildGlobalPlugin(options) {
|
|
const keys = Object.keys(options);
|
|
return {
|
|
name: 'global',
|
|
setup(build) {
|
|
keys.forEach((key) => {
|
|
const namespace = key + '-ns';
|
|
build.onResolve({ filter: new RegExp('^' + key + '$') }, ({ path }) => {
|
|
return {
|
|
path,
|
|
namespace,
|
|
};
|
|
});
|
|
build.onLoad({ filter: /.*/, namespace }, () => ({
|
|
contents: `module.exports = ${options[key]}`,
|
|
loader: 'js',
|
|
}));
|
|
});
|
|
},
|
|
};
|
|
}
|
|
function wrapperNVueAppStyles(code) {
|
|
return code.replace(/__uniConfig.styles=(.*);\/\/styles/, `__uniConfig.styles=${process.env.UNI_NVUE_APP_STYLES || '[]'};//styles`);
|
|
}
|
|
exports.wrapperNVueAppStyles = wrapperNVueAppStyles;
|