@complex-suite/utils
Advanced tools
| /** | ||
| * import.meta.env 类型补充(供本模块与主项目统一使用)。 | ||
| * DEV 声明与 vite/client 完全一致(DEV: boolean,非 readonly;修饰符必须一致否则 TS2687), | ||
| * interface 合并无冲突;utils 包自身不依赖 vite/client 类型,故在此声明。 | ||
| */ | ||
| declare global { | ||
| interface ImportMetaEnv { | ||
| DEV: boolean | ||
| } | ||
| interface ImportMeta { | ||
| readonly env: ImportMetaEnv | ||
| } | ||
| } | ||
| /** | ||
| * 开发环境探测(无依赖独立模块,供 env/index 与 locale/Locale 复用)。 | ||
| * | ||
| * 兼容策略(两段独立 try/catch,互不影响): | ||
| * 1. Vite:import.meta.env.DEV 在编译期被静态替换为布尔字面量(dev=true / prod=false); | ||
| * 必须书写精确的 import.meta.env.DEV——构建工具只做文本级静态替换, | ||
| * 写成 import.meta.env?.DEV 等可选链形式会导致替换失效。 | ||
| * 2. webpack(DefinePlugin 编译期替换)/ Node(真实 process): | ||
| * 同样必须书写精确的 process.env.NODE_ENV,外层 try/catch 兜底无构建环境。 | ||
| */ | ||
| export default function isDev(): boolean { | ||
| try { | ||
| if (import.meta.env.DEV === true) return true | ||
| } catch (err) { | ||
| // 非 ESM / 非 Vite 环境(import.meta.env 不存在):忽略 | ||
| } | ||
| try { | ||
| return process.env.NODE_ENV !== 'production' | ||
| } catch (err) { | ||
| // 无 process(纯浏览器无构建):兜底为非开发环境 | ||
| return false | ||
| } | ||
| } |
+4
-0
@@ -10,2 +10,6 @@ <!-- | ||
| ### 3.0.20 | ||
| - feat(env): 新增 `isDev` 统一开发环境探测(无依赖独立模块 `env/isDev.ts`),兼容 Vite(`import.meta.env.DEV` 编译期替换)与 webpack DefinePlugin / Node(`process.env.NODE_ENV`),探测结果缓存到 env 变量供 `Locale.isDev` 复用 | ||
| - fix(env): 修复原 `typeof process !== 'undefined'` 拦截导致 Vite/webpack5 浏览器环境下 `isDev` 恒为 false 的问题——构建工具仅对精确表达式做文本级静态替换,typeof 判断短路使编译期替换值不可达;改为 try/catch 兜底无构建环境 | ||
| ### 3.0.19 | ||
@@ -12,0 +16,0 @@ - chore: 小版本升级,保持与套件其他子包版本同步 |
+1
-1
| { | ||
| "name": "@complex-suite/utils", | ||
| "version": "3.0.19", | ||
| "version": "3.0.20", | ||
| "description": "a complex utils", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+11
-9
@@ -6,4 +6,7 @@ import { LifeList } from "../class/LifeData" | ||
| import Locale from '../locale/Locale' | ||
| import isDev from './isDev' | ||
| const option = { | ||
| /** 模块加载时缓存的构建环境开发探测结果(Vite / webpack / Node),供 Locale.isDev 等复用 */ | ||
| $isDev: isDev(), | ||
| env: { | ||
@@ -18,4 +21,5 @@ data: '', | ||
| * 设置环境变量 | ||
| * @param {*} data 环境变量 | ||
| * @param {string} prop 环境变量属性值,data为当前环境变量,real为当前真实的环境变量 | ||
| * @param prop 环境变量属性名(data 为当前环境值,real 为当前真实环境值) | ||
| * @param data 环境变量值 | ||
| * @param unTriggerChange 为 true 时仅写入,不触发 onChange 通知 | ||
| */ | ||
@@ -31,3 +35,3 @@ export function setEnv(prop: string, data: any, unTriggerChange?: boolean) { | ||
| * 获取环境变量 | ||
| * @param {string} prop 环境变量属性值,data为当前环境变量,real为当前真实的环境变量 | ||
| * @param prop 环境变量属性名(data 为当前环境值,real 为当前真实环境值) | ||
| */ | ||
@@ -53,4 +57,5 @@ export function getEnv(prop: string) { | ||
| // 自动设置 locale 的开发环境判断逻辑(引用 env 模块时自动生效) | ||
| // real 未设置时回退到 process.env.NODE_ENV 判断,避免初始状态下 dev 日志被静默 | ||
| // 自动覆盖 locale 的开发环境判断逻辑(引用 env 模块时自动生效) | ||
| // 优先级:应用自定义的真实环境(real)> 构建环境探测缓存(option.isDev) | ||
| // real 未设置时回退到构建环境探测结果,避免初始状态下 dev 日志被静默 | ||
| Locale.isDev = () => { | ||
@@ -61,6 +66,3 @@ const real = getEnv('real') | ||
| } | ||
| if (typeof process !== 'undefined' && process.env) { | ||
| return process.env.NODE_ENV !== 'production' | ||
| } | ||
| return false | ||
| return option.$isDev === true | ||
| } |
| import type { FlatMessages, MessageValue, LocalePack, LocaleOptions, ChangeFrom } from './types' | ||
| import hasOwnKey from '../object/hasOwnKey' | ||
| import isDev from '../env/isDev' | ||
@@ -18,9 +19,6 @@ /** | ||
| * 需自定义时直接复写:Locale.isDev = () => yourChecker() | ||
| * 默认实现委托独立的 isDev(env/isDev.ts,无依赖), | ||
| * 兼容 Vite(import.meta.env.DEV)/ webpack DefinePlugin、Node(process.env.NODE_ENV)。 | ||
| */ | ||
| static isDev: () => boolean = () => { | ||
| if (typeof process !== 'undefined' && process.env) { | ||
| return process.env.NODE_ENV !== 'production' | ||
| } | ||
| return false | ||
| } | ||
| static isDev: () => boolean = () => isDev() | ||
@@ -27,0 +25,0 @@ /** |
232890
1.01%114
0.88%5070
0.72%5
-37.5%