vue-cli-plugin-extend-base
Version:
@vue/cli official plug-in extension
118 lines (117 loc) • 3.78 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.DEFAULT_BASE_PLUGIN_OPTION = void 0;
/**
* 默认插件配置
*/
exports.DEFAULT_BASE_PLUGIN_OPTION = {
eslint: true,
forkTsChecker: true,
crossEnvVersion: '^7.0.3',
};
/**
* 全局自定义变量
* @param config
* @param opts
*/
const customDefineGlobalVariable = (config, opts) => {
const webpack = require('webpack');
const prefixREG = /^APP_/;
const { version, port, baseUrl, mocked, environment } = opts;
const raw = Object.keys(process.env)
.filter((key) => prefixREG.test(key))
.reduce((env, key) => {
env[key] = process.env[key];
return env;
},
/* 初始化值 */
{
BASE_URL: baseUrl,
MOCK: mocked,
APP_VERSION: version,
APP_ENV: environment,
APP_PORT: port,
APP_BASE: baseUrl,
// 请求库使用的全局变量
APP_REQUEST_PREFIX: '',
APP_REQUEST_PROXY: !!process.env.PROXY || false,
APP_REQUEST_START_REPLACE_EMPTY: '/api',
APP_REQUEST_RESULT_FORMAT: '$.data',
});
const env = Object.keys(raw).reduce((pre, key) => {
pre[key] = JSON.stringify(raw[key]);
return pre;
}, {});
/* 1.添加全局变量 */
config.plugin('custom-define').use(webpack.DefinePlugin, [
{
...env,
},
]);
};
/**
* TS 检查校验
* @param config
* @param forkTsChecker
*/
const forkTsVerify = (config, forkTsChecker) => {
/* 5. fork-ts-checker 插件配置 */
if (forkTsChecker) {
/* 修改 fork-ts-checker 插件,导致无.vue后缀的组件导入错误 */
if (Object.keys(forkTsChecker).length === 0) {
config.plugins.get('fork-ts-checker').tap((args) => {
const [options] = args;
const { typescript: { extensions, diagnosticOptions }, } = options;
const result = {
typescript: {
extensions,
diagnosticOptions: { ...diagnosticOptions, semantic: false },
},
};
return [result];
});
}
else {
config.plugins.get('fork-ts-checker').tap(() => [forkTsChecker]);
}
}
else {
/* 或者直接删除 */
config.plugins.delete('fork-ts-checker');
}
};
/**
* service 插件
* @param api
* @param projectOptions
*/
exports.default = (api, projectOptions) => {
const { pluginOptions } = projectOptions || {};
const extendBase = pluginOptions.extendBase || {};
const { eslint, forkTsChecker } = extendBase;
api.chainWebpack((config) => {
const baseUrl = String(process.env.BASE_URL || '/');
const port = Number(process.env.APP_PORT || 8080);
const isProd = process.env.NODE_ENV === 'production';
const environment = isProd ? false : 'dev';
const opts = {
baseUrl,
port,
environment,
mocked: false,
version: require(`${api.getCwd()}/package.json`).version,
};
customDefineGlobalVariable(config, opts);
/* 2.开发环境配置 */
config.devServer.open(true).port(port).hot(true);
/* 3.依据环境变量同步修改 publicPath */
projectOptions.publicPath = baseUrl;
config.output.publicPath(baseUrl);
/* 4.移除 eslint 检查 */
if (!eslint) {
config.plugins.delete('eslint');
}
/* 5. fork-ts-checker 插件配置 */
forkTsVerify(config, forkTsChecker);
});
};
;