You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
7.7 KiB

2 months ago
"use strict";
// 注意该文件尽可能少依赖其他文件否则可能会导致还没有alias的时候就加载了目标模块
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;
const fs_1 = __importDefault(require("fs"));
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 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');
// TODO 临时开关启用vapor
if (!process.env.UNI_VUE_VAPOR &&
process.env.UNI_INPUT_DIR &&
// 该代码执行较早不能使用UNI_UTS_PLATFORM
(process.env.UNI_PLATFORM === 'app-harmony' ||
(process.env.UNI_PLATFORM === 'app' &&
process.env.UNI_APP_PLATFORM === 'ios'))) {
const vaporConfig = path_1.default.resolve(process.env.UNI_INPUT_DIR, '.vapor');
if (fs_1.default.existsSync(vaporConfig)) {
process.env.UNI_VUE_VAPOR = 'true';
if (fs_1.default.readFileSync(vaporConfig, 'utf-8').trim() === '*') {
process.env.UNI_VUE_VAPOR_ALL = 'true';
}
}
}
if (process.env.UNI_VUE_VAPOR === 'true') {
const vuePkgs = [
'@vue/compiler-core',
'@vue/compiler-dom',
'@vue/compiler-sfc',
'@vue/compiler-ssr',
'@vue/compiler-vapor',
'@vue/server-renderer',
'@vue/shared',
];
vuePkgs.forEach((pkg) => {
module_alias_1.default.addAlias(pkg, path_1.default.resolve(libDir, 'vapor', '@vue', pkg.split('/').pop()));
});
module_alias_1.default.addAlias('@vitejs/plugin-vue', path_1.default.resolve(libDir, 'vapor', '@vitejs', 'plugin-vue'));
}
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;