babel-preset-uniify
Version:
统一的Babel预设,支持React 17/18、TypeScript和Node环境
178 lines (177 loc) • 5.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveReactVersion = resolveReactVersion;
exports.resolveTargets = resolveTargets;
exports.resolveModules = resolveModules;
exports.buildPresetEnvConfig = buildPresetEnvConfig;
exports.resolveJsxConfig = resolveJsxConfig;
exports.shouldUseTransformRuntime = shouldUseTransformRuntime;
/**
* 解析React版本号
*/
function resolveReactVersion(version) {
if (!version)
return '18'; // 默认使用最新稳定版
const strVersion = typeof version === 'number' ? version.toString() : version;
if (strVersion.startsWith('17'))
return '17';
return '18';
}
/**
* 根据环境类型和React版本解析目标环境配置
*/
function resolveTargets(targets, envType, reactVersion) {
// 如果用户明确指定了targets,直接使用
if (targets && targets !== 'es5' && targets !== 'es6' && targets !== 'node') {
return targets;
}
const resolvedReactVersion = resolveReactVersion(reactVersion);
const isNodeEnv = envType === null || envType === void 0 ? void 0 : envType.includes('node');
const isLib = envType === null || envType === void 0 ? void 0 : envType.includes('lib');
const isH5 = envType === null || envType === void 0 ? void 0 : envType.includes('h5');
// Node环境目标配置
if (isNodeEnv) {
return targets === 'node' ? 'node >= 18' : targets;
}
// H5环境目标配置
if (isH5) {
// 库模式需要更广泛的兼容性
if (isLib) {
return targets === 'es5'
? ['last 3 versions', '> 0.5%', 'ie >= 11']
: ['last 2 versions', '> 1%', 'not dead', 'not ie <= 11'];
}
// 普通H5环境
return targets === 'es5'
? ['last 2 versions', '> 1%', 'ie >= 11']
: ['last 2 versions', '> 1%', 'not dead', 'not ie <= 11'];
}
// React/Preact环境目标配置
if (targets === 'es5') {
// React 17仍然支持IE 11
if (resolvedReactVersion === '17') {
return [
'ie 11',
'chrome >= 55',
'firefox >= 52',
'safari >= 10',
'edge >= 15',
'ios >= 10',
'android >= 6'
];
}
// React 18不再支持IE 11
return [
'chrome >= 60',
'firefox >= 55',
'safari >= 11',
'edge >= 16',
'ios >= 11',
'android >= 7'
];
}
// ES6目标配置 - 现代浏览器
return [
'last 2 years',
'> 1%',
'not dead',
'not ie <= 11',
'not op_mini all',
'fully supports es6-module'
];
}
/**
* 解析模块类型
*/
function resolveModules(modules, envType) {
// 用户明确指定则使用用户配置
if (modules !== undefined) {
return modules;
}
// 库类型默认使用ES模块
if ((envType === null || envType === void 0 ? void 0 : envType.includes('lib')) || (envType === null || envType === void 0 ? void 0 : envType.includes('esm'))) {
return false;
}
// Node环境默认使用CommonJS
if (envType === null || envType === void 0 ? void 0 : envType.includes('node')) {
return 'commonjs';
}
// H5环境默认自动处理
if (envType === null || envType === void 0 ? void 0 : envType.includes('h5')) {
return 'auto';
}
// 默认自动处理
return 'auto';
}
/**
* 构建预设环境配置
*/
function buildPresetEnvConfig(envType, targets, modules) {
const isLib = envType.includes('lib');
const isNode = envType.includes('node');
// 基础配置
const config = {
modules,
targets
};
// React 18+在现代环境下可以减少polyfill
if (!isLib && !isNode) {
config.useBuiltIns = 'usage';
config.corejs = 3;
}
// H5库模式优化
if (isLib) {
config.useBuiltIns = false;
}
// Node环境不需要自动注入polyfill
if (isNode) {
config.useBuiltIns = false;
}
return config;
}
/**
* 解析JSX配置
*/
function resolveJsxConfig(envType, jsxImportSource) {
const isReact = (envType === null || envType === void 0 ? void 0 : envType.includes('react')) && !envType.includes('h5');
const isPreact = (envType === null || envType === void 0 ? void 0 : envType.includes('preact')) && !envType.includes('h5');
// H5环境不使用JSX配置
if (envType === null || envType === void 0 ? void 0 : envType.includes('h5')) {
return null;
}
if (!isReact && !isPreact) {
return null;
}
return {
runtime: 'automatic',
importSource: jsxImportSource || (isPreact ? 'preact' : 'react'),
development: process.env.NODE_ENV === 'development'
};
}
/**
* 检查是否需要使用transform-runtime插件
*/
function shouldUseTransformRuntime(envType, modules, explicitFlag) {
// 显式指定则使用显式值
if (explicitFlag !== undefined) {
return explicitFlag;
}
// 库模式默认使用
if (envType === null || envType === void 0 ? void 0 : envType.includes('lib')) {
return true;
}
// 非ES模块模式使用:先通过类型守卫区分modules类型,避免类型冲突
if (modules !== undefined) {
// 1. 先判断是否为boolean类型(modules: false 表示保留ES模块,不转换)
if (typeof modules === 'boolean') {
// boolean类型下,只有 modules: false 是ES模块,其他情况(理论上无)均为非ES模块
return !modules;
}
// 2. 再判断是否为string类型(排除 'esm' 以外的字符串均为非ES模块)
if (typeof modules === 'string') {
return modules !== 'esm';
}
}
// 默认:非ES模块场景(兜底)
return false;
}