import { defineConfig } from '@tarojs/cli'; import path from 'path'; export default defineConfig(async (merge) => { // 生产构建缺少加密密钥时发出警告(不阻断构建,但提示开发者/CI 配置) if (process.env.NODE_ENV === 'production' && !process.env.TARO_APP_ENCRYPTION_KEY) { console.warn('[config] ⚠ TARO_APP_ENCRYPTION_KEY 未设置,将回退到 .env 中的开发密钥'); console.warn('[config] 生产部署应通过 CI/CD 环境变量注入独立密钥'); } const baseConfig = { projectName: 'hms-miniprogram', date: '2026-4-23', designWidth: 375, deviceRatio: { 640: 2.34 / 2, 750: 1, 375: 2, 828: 1.81 / 2 }, sourceRoot: 'src', outputRoot: process.env.TARO_ENV === 'h5' ? 'dist-h5' : 'dist', plugins: [], defineConstants: { 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 'process.env.TARO_APP_API_URL': JSON.stringify(process.env.TARO_APP_API_URL || 'http://localhost:3000/api/v1'), 'process.env.TARO_APP_ENCRYPTION_KEY': JSON.stringify(process.env.TARO_APP_ENCRYPTION_KEY || ''), 'process.env.TARO_APP_WX_TEMPLATE_APPOINTMENT': JSON.stringify(process.env.TARO_APP_WX_TEMPLATE_APPOINTMENT || ''), 'process.env.TARO_APP_WX_TEMPLATE_FOLLOWUP': JSON.stringify(process.env.TARO_APP_WX_TEMPLATE_FOLLOWUP || ''), 'process.env.TARO_APP_WX_TEMPLATE_REPORT': JSON.stringify(process.env.TARO_APP_WX_TEMPLATE_REPORT || ''), 'process.env.TARO_APP_WX_TEMPLATE_CRITICAL_ALERT': JSON.stringify(process.env.TARO_APP_WX_TEMPLATE_CRITICAL_ALERT || ''), 'process.env.TARO_APP_WX_TEMPLATE_HEALTH_ABNORMAL': JSON.stringify(process.env.TARO_APP_WX_TEMPLATE_HEALTH_ABNORMAL || ''), 'process.env.TARO_APP_WX_TEMPLATE_MEDICATION': JSON.stringify(process.env.TARO_APP_WX_TEMPLATE_MEDICATION || ''), 'process.env.TARO_APP_DEFAULT_TENANT_ID': JSON.stringify(process.env.TARO_APP_DEFAULT_TENANT_ID || ''), 'process.env.TARO_APP_DEV_USER': JSON.stringify( process.env.NODE_ENV === 'production' ? '' : (process.env.TARO_APP_DEV_USER || '') ), 'process.env.TARO_APP_DEV_PASS': JSON.stringify( process.env.NODE_ENV === 'production' ? '' : (process.env.TARO_APP_DEV_PASS || '') ), }, copy: { patterns: [], options: {} }, framework: 'react', compiler: 'webpack5', alias: { '@': path.resolve(__dirname, '..', 'src'), }, sass: { resource: ['src/styles/variables.scss'], }, mini: { virtualHost: true, copy: { patterns: [ { from: 'src/native-components/', to: 'dist/native-components/', ignore: ['*.ts'] }, ], options: {}, }, compile: { exclude: [], include: [], }, commonChunks: ['runtime', 'vendors', 'taro', 'common'], addChunkPages(pages) { // 主包 TabBar 页面保持 common chunk const tabBarPages = new Set([ 'pages/index/index', 'pages/health/index', 'pages/mall/index', 'pages/messages/index', 'pages/profile/index', ]); pages.forEach((page) => { if (page.name === 'app') return; // 分包页面不注入 common chunk,由分包自己的 vendors.js 承载 if (page.name.startsWith('pages/pkg-')) return; if (tabBarPages.has(page.name) || !page.name.startsWith('pages/')) { page.chunks?.unshift('common'); } }); }, miniCssExtractPluginOption: { ignoreOrder: true, }, postcss: { pxtransform: { enable: true, config: {} }, cssModules: { enable: false, config: { namingPattern: 'module', generateScopedName: '[name]__[local]___[hash:base64:5]' }, }, }, }, h5: { publicPath: '/', staticDirectory: 'static', postcss: { autoprefixer: { enable: true, config: {} }, cssModules: { enable: false, config: { namingPattern: 'module', generateScopedName: '[name]__[local]___[hash:base64:5]' }, }, }, }, }; const devConfig = (await import('./dev')).default; const prodConfig = (await import('./prod')).default; if (process.env.NODE_ENV === 'production') { return merge({}, baseConfig, prodConfig); } return merge({}, baseConfig, devConfig); });