UNPKG

babel-preset-uniify

Version:

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

119 lines (118 loc) 4.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = preset; const utils_1 = require("./utils"); /** * 多功能Babel预设库 * 支持多种环境类型,自动适配最佳配置 */ function preset(_, options = {}) { // 解构配置并设置默认值 const { type = 'react', targets, modules, reactVersion, jsxImportSource, development = process.env.NODE_ENV === 'development', useTransformRuntime } = options; // 解析环境类型和React版本 const envType = type; const resolvedReactVersion = (0, utils_1.resolveReactVersion)(reactVersion); // 环境类型特征检测 const isLib = envType.includes('lib'); const isH5 = envType.includes('h5'); const isTypeScript = envType.includes('-ts'); const isReact = envType.includes('react') && !isH5; const isPreact = envType.includes('preact') && !isH5; // 解析目标环境和模块类型 const resolvedTargets = (0, utils_1.resolveTargets)(targets, envType, resolvedReactVersion); const resolvedModules = (0, utils_1.resolveModules)(modules, envType); // 判断是否为现代ES模块 const isModernEsModule = resolvedModules === false || resolvedModules === 'esm'; // 构建插件列表 const plugins = []; // 1. 运行时优化插件 - 根据环境类型智能判断 const useRuntime = (0, utils_1.shouldUseTransformRuntime)(envType, resolvedModules, useTransformRuntime); if (useRuntime) { try { // 确保依赖存在 require.resolve('@babel/plugin-transform-runtime'); plugins.push([ require('@babel/plugin-transform-runtime'), { corejs: isLib ? 3 : false, helpers: true, regenerator: true, useESModules: isModernEsModule, // 库模式下指定绝对路径,确保正确解析 absoluteRuntime: isLib ? require.resolve('@babel/runtime/package.json').replace(/package\.json$/, '') : undefined } ]); } catch (err) { throw new Error(`使用类型 ${envType} 需要安装 @babel/plugin-transform-runtime。\n` + `请运行: npm install --save-dev @babel/plugin-transform-runtime\n` + `${isLib ? '以及: npm install --save @babel/runtime-corejs3' : ''}`); } } // 2. 开发环境热更新插件 - 非lib模式且是React/Preact环境 if (development && !isLib && (isReact || isPreact)) { try { if (isReact) { require.resolve('react-refresh/babel'); plugins.push([require('react-refresh/babel'), { skipEnvCheck: true }]); } else if (isPreact) { require.resolve('@prefresh/babel-plugin'); plugins.push([require('@prefresh/babel-plugin')]); } } catch (err) { // 热更新插件缺失时仅警告,不中断流程 console.warn(`开发环境建议安装热更新插件: ${isReact ? 'react-refresh' : '@prefresh/babel-plugin'}`); } } // 构建预设列表 const presets = []; // 1. 核心预设(处理ES特性) presets.push([ require('@babel/preset-env'), (0, utils_1.buildPresetEnvConfig)(envType, resolvedTargets, resolvedModules) ]); // 2. TypeScript预设(如果需要) if (isTypeScript) { try { require.resolve('@babel/preset-typescript'); presets.push([require('@babel/preset-typescript')]); } catch (err) { throw new Error(`使用TypeScript类型(${envType})需要安装@babel/preset-typescript`); } } // 3. JSX预设(如果需要)- H5环境不需要 if (!isH5) { const jsxConfig = (0, utils_1.resolveJsxConfig)(envType, jsxImportSource); if (jsxConfig) { try { require.resolve('@babel/preset-react'); presets.push([require('@babel/preset-react'), jsxConfig]); } catch (err) { throw new Error(`使用JSX环境(${envType})需要安装@babel/preset-react`); } } } return { sourceType: isModernEsModule ? 'module' : 'unambiguous', presets, plugins, overrides: [ { test: /node_modules/, exclude: useRuntime ? [/@babel[/\\]runtime/, /core-js/] : [], sourceType: 'unambiguous' } ], assumptions: { setPublicClassFields: true, privateFieldsAsProperties: true, noDocumentAll: true } }; }