232 lines
10 KiB
JavaScript
232 lines
10 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.formatInstallHBuilderXPluginTips = exports.moduleAliasFormatter = exports.installHBuilderXPlugin = exports.initModuleAlias = void 0;
|
||
// 注意:该文件尽可能少依赖其他文件,否则可能会导致还没有alias的时候,就加载了目标模块
|
||
const path_1 = __importDefault(require("path"));
|
||
const module_alias_1 = __importDefault(require("module-alias"));
|
||
const utils_1 = require("./utils");
|
||
const hbxPlugins = {
|
||
typescript: 'compile-typescript/node_modules/typescript',
|
||
less: 'compile-less/node_modules/less',
|
||
sass: 'compile-dart-sass/node_modules/sass',
|
||
stylus: 'compile-stylus/node_modules/stylus',
|
||
pug: 'compile-pug-cli/node_modules/pug',
|
||
};
|
||
function isWebOrMpPlatform(platform) {
|
||
return platform === 'h5' || platform === 'web' || platform?.startsWith('mp-');
|
||
}
|
||
function initModuleAlias() {
|
||
const libDir = path_1.default.resolve(__dirname, '../../lib');
|
||
const compilerSfcPath = path_1.default.resolve(libDir, '@vue/compiler-sfc');
|
||
const serverRendererPath = require.resolve('@vue/server-renderer');
|
||
if (process.env.UNI_OUTPUT_DIR) {
|
||
const baseOutDir = path_1.default.basename(process.env.UNI_OUTPUT_DIR);
|
||
process.env.UNI_APP_X_CACHE_DIR =
|
||
process.env.UNI_APP_X_CACHE_DIR ||
|
||
path_1.default.resolve(process.env.UNI_OUTPUT_DIR, '../cache/.' + baseOutDir);
|
||
}
|
||
// 对路径进行兼容
|
||
if (!process.env.UNI_APP_X_DOM2_CPP_DIR &&
|
||
process.env.UNI_APP_HARMONY_DOM2_CPP_DIR) {
|
||
process.env.UNI_APP_X_DOM2_CPP_DIR =
|
||
process.env.UNI_APP_HARMONY_DOM2_CPP_DIR;
|
||
}
|
||
// alias 初始化可能早于 CLI 环境初始化,这里仅依据外部预置的平台环境变量判断。
|
||
// 如果是 web 和小程序,目前强制非蒸汽。
|
||
const utsPlatform = process.env.UNI_UTS_PLATFORM;
|
||
const uniPlatform = process.env.UNI_PLATFORM;
|
||
if (isWebOrMpPlatform(utsPlatform) || isWebOrMpPlatform(uniPlatform)) {
|
||
delete process.env.UNI_APP_X_DOM2;
|
||
delete process.env.UNI_APP_X_DOM2_DYNAMIC;
|
||
}
|
||
if (process.env.UNI_APP_X_DOM2 === 'true') {
|
||
if (process.env.UNI_OUTPUT_DIR &&
|
||
(process.env.UNI_PLATFORM === 'app' ||
|
||
process.env.UNI_PLATFORM === 'app-plus' ||
|
||
process.env.UNI_PLATFORM === 'app-harmony')) {
|
||
if (!process.env.UNI_APP_X_DOM2_CPP_DIR) {
|
||
let baseDir = '';
|
||
const isAndroid = process.env.UNI_APP_PLATFORM === 'android';
|
||
const isIOS = process.env.UNI_APP_PLATFORM === 'ios';
|
||
if (process.env.NODE_ENV !== 'development' && (isAndroid || isIOS)) {
|
||
baseDir = path_1.default.resolve(process.env.UNI_OUTPUT_DIR, '.uniappx', isAndroid ? 'android' : 'ios');
|
||
}
|
||
else {
|
||
baseDir =
|
||
process.env.UNI_PLATFORM === 'app-harmony'
|
||
? process.env.UNI_OUTPUT_DIR
|
||
: process.env.UNI_APP_X_CACHE_DIR || process.env.UNI_OUTPUT_DIR;
|
||
}
|
||
process.env.UNI_APP_X_DOM2_CPP_DIR = path_1.default.resolve(baseDir, 'cpp');
|
||
process.env.UNI_APP_X_DOM2_SO_DIR = path_1.default.resolve(baseDir, 'so');
|
||
}
|
||
if (!process.env.UNI_APP_X_DOM2_KT_DIR) {
|
||
if (process.env.NODE_ENV !== 'development') {
|
||
process.env.UNI_APP_X_DOM2_KT_DIR = path_1.default.resolve(process.env.UNI_OUTPUT_DIR, '.uniappx/android', 'src');
|
||
}
|
||
else {
|
||
process.env.UNI_APP_X_DOM2_KT_DIR = path_1.default.resolve(process.env.UNI_APP_X_CACHE_DIR ||
|
||
path_1.default.resolve(process.env.UNI_OUTPUT_DIR, '../.cache'), 'src');
|
||
}
|
||
}
|
||
}
|
||
if (process.env.UNI_APP_PLATFORM ||
|
||
process.env.UNI_PLATFORM === 'app-harmony') {
|
||
if (!process.env.UNI_APP_X_VAPOR_RENDER_TARGET) {
|
||
// 默认 app 平台使用 bytecode 目标
|
||
process.env.UNI_APP_X_VAPOR_RENDER_TARGET = 'bytecode';
|
||
}
|
||
if (process.env.UNI_APP_X_VAPOR_RENDER_TARGET?.includes('bytecode')) {
|
||
process.env.UNI_APP_X_DOM2_DYNAMIC = 'true';
|
||
}
|
||
// 如果是 ext-api 目标,强制使用 nativecode 目标
|
||
if (process.env.UNI_COMPILE_TARGET === 'ext-api') {
|
||
delete process.env.UNI_APP_X_DOM2_DYNAMIC;
|
||
}
|
||
}
|
||
}
|
||
if (process.env.UNI_APP_X_DOM2 === 'true') {
|
||
const vuePkgs = [
|
||
'@vue/compiler-core',
|
||
'@vue/compiler-dom',
|
||
'@vue/compiler-sfc',
|
||
'@vue/compiler-vapor',
|
||
'@vue/shared',
|
||
];
|
||
vuePkgs.forEach((pkg) => {
|
||
module_alias_1.default.addAlias(pkg, path_1.default.resolve(libDir, 'dom2', 'app', '@vue', pkg.split('/').pop()));
|
||
});
|
||
module_alias_1.default.addAlias('@vitejs/plugin-vue', path_1.default.resolve(libDir, 'dom2', 'app', '@vitejs', 'plugin-vue'));
|
||
module_alias_1.default.addAlias('@dcloudio/compiler-vapor-dom2', path_1.default.resolve(libDir, 'dom2', 'app', '@vue', 'compiler-vapor-dom2'));
|
||
}
|
||
else {
|
||
module_alias_1.default.addAliases({
|
||
'@vue/shared': require.resolve('@vue/shared'),
|
||
'@vue/shared/dist/shared.esm-bundler.js': require.resolve('@vue/shared/dist/shared.esm-bundler.js'),
|
||
'@vue/compiler-core': path_1.default.resolve(libDir, '@vue/compiler-core'),
|
||
'@vue/compiler-dom': require.resolve('@vue/compiler-dom'),
|
||
'@vue/compiler-sfc': compilerSfcPath,
|
||
'@vue/server-renderer': serverRendererPath,
|
||
'vue/compiler-sfc': compilerSfcPath,
|
||
'vue/server-renderer': serverRendererPath,
|
||
});
|
||
}
|
||
if (process.env.VITEST) {
|
||
module_alias_1.default.addAliases({
|
||
vue: '@dcloudio/uni-h5-vue',
|
||
'vue/package.json': '@dcloudio/uni-h5-vue/package.json',
|
||
});
|
||
}
|
||
if ((0, utils_1.isInHBuilderX)()) {
|
||
// 又是为了复用 HBuilderX 的插件逻辑,硬编码映射
|
||
Object.keys(hbxPlugins).forEach((lang) => {
|
||
const realPath = path_1.default.resolve(process.env.UNI_HBUILDERX_PLUGINS, hbxPlugins[lang]);
|
||
module_alias_1.default.addAlias(lang,
|
||
// @ts-expect-error
|
||
() => {
|
||
try {
|
||
require.resolve(realPath);
|
||
}
|
||
catch (e) {
|
||
const msg = exports.moduleAliasFormatter.format(`Preprocessor dependency "${lang}" not found. Did you install it?`);
|
||
console.error(msg);
|
||
process.exit(0);
|
||
}
|
||
return realPath;
|
||
});
|
||
});
|
||
// web 平台用了 vite 内置 css 插件,该插件会加载预编译器如scss、less等,需要转向到 HBuilderX 的对应编译器插件
|
||
if (process.env.UNI_PLATFORM === 'h5' ||
|
||
process.env.UNI_PLATFORM === 'web') {
|
||
// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/packages.ts#L92
|
||
// 拦截预编译器
|
||
const join = path_1.default.join;
|
||
path_1.default.join = function (...paths) {
|
||
if (paths.length === 4) {
|
||
// path.join(basedir, 'node_modules', pkgName, 'package.json')
|
||
// const basedir = paths[0]
|
||
const nodeModules = paths[1]; // = node_modules
|
||
const pkgName = paths[2];
|
||
const packageJson = paths[3]; // = package.json
|
||
if (nodeModules === 'node_modules' &&
|
||
packageJson === 'package.json' &&
|
||
hbxPlugins[pkgName]) {
|
||
return path_1.default.resolve(process.env.UNI_HBUILDERX_PLUGINS, hbxPlugins[pkgName], packageJson);
|
||
}
|
||
}
|
||
return join(...paths);
|
||
};
|
||
// https://github.com/vitejs/vite/blob/892916d040a035edde1add93c192e0b0c5c9dd86/packages/vite/src/node/plugins/css.ts#L1481
|
||
// const oldSync = resovle.sync
|
||
// resovle.sync = (id: string, opts?: SyncOpts) => {
|
||
// if ((hbxPlugins as any)[id]) {
|
||
// return path.resolve(
|
||
// process.env.UNI_HBUILDERX_PLUGINS,
|
||
// hbxPlugins[id as keyof typeof hbxPlugins]
|
||
// )
|
||
// }
|
||
// return oldSync(id, opts)
|
||
// }
|
||
}
|
||
}
|
||
}
|
||
exports.initModuleAlias = initModuleAlias;
|
||
function supportAutoInstallPlugin() {
|
||
return !!process.env.HX_Version;
|
||
}
|
||
function installHBuilderXPlugin(plugin) {
|
||
if (!supportAutoInstallPlugin()) {
|
||
return;
|
||
}
|
||
return console.error(`%HXRunUniAPPPluginName%${plugin}%HXRunUniAPPPluginName%`);
|
||
}
|
||
exports.installHBuilderXPlugin = installHBuilderXPlugin;
|
||
const installPreprocessorTips = {};
|
||
exports.moduleAliasFormatter = {
|
||
test(msg) {
|
||
return msg.includes('Preprocessor dependency');
|
||
},
|
||
format(msg) {
|
||
let lang = '';
|
||
let preprocessor = '';
|
||
if (msg.includes(`"pug"`)) {
|
||
lang = 'pug';
|
||
preprocessor = 'compile-pug-cli';
|
||
}
|
||
else if (msg.includes(`"sass"`)) {
|
||
lang = 'sass';
|
||
preprocessor = 'compile-dart-sass';
|
||
}
|
||
else if (msg.includes(`"less"`)) {
|
||
lang = 'less';
|
||
preprocessor = 'compile-less';
|
||
}
|
||
else if (msg.includes('"stylus"')) {
|
||
lang = 'stylus';
|
||
preprocessor = 'compile-stylus';
|
||
}
|
||
else if (msg.includes('"typescript"')) {
|
||
lang = 'typescript';
|
||
preprocessor = 'compile-typescript';
|
||
}
|
||
if (lang) {
|
||
// 仅提醒一次
|
||
if (installPreprocessorTips[lang]) {
|
||
return '';
|
||
}
|
||
installPreprocessorTips[lang] = true;
|
||
installHBuilderXPlugin(preprocessor);
|
||
return formatInstallHBuilderXPluginTips(lang, preprocessor);
|
||
}
|
||
return msg;
|
||
},
|
||
};
|
||
function formatInstallHBuilderXPluginTips(lang, preprocessor) {
|
||
return `预编译器错误:代码使用了${lang}语言,但未安装相应的编译器插件,${supportAutoInstallPlugin() ? '正在从' : '请前往'}插件市场安装该插件:
|
||
https://ext.dcloud.net.cn/plugin?name=${preprocessor}`;
|
||
}
|
||
exports.formatInstallHBuilderXPluginTips = formatInstallHBuilderXPluginTips;
|