UNPKG

babel-preset-uniify

Version:

统一的Babel预设,支持React 17/18、TypeScript和Node环境

178 lines (177 loc) 5.96 kB
"use strict"; 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; }