Open zhenhappy opened 1 month ago
vite的环境变量import.meta.env.DEV
,import.meta.env.PROD
可以吗?
vite的环境变量
import.meta.env.DEV
,import.meta.env.PROD
可以吗?
试了下直接不能运行,import.meta.env.DEV应该是在运行时里面获取的,manifest.config.ts好像拿不到
试了下直接不能运行,import.meta.env.DEV应该是在运行时里面获取的,manifest.config.ts好像拿不到
麻烦再试下process.env.NODE_ENV
呢?
打印下process.env
,有没有process.env.NODE_ENV
,process.env.UNI_PLATFORM
这样的变量。
我是看了下uniapp的文档上面这样写的,不清楚是否可行。https://uniapp.dcloud.net.cn/collocation/vite-config.html
试了下直接不能运行,import.meta.env.DEV应该是在运行时里面获取的,manifest.config.ts好像拿不到
麻烦再试下
process.env.NODE_ENV
呢? 打印下process.env
,有没有process.env.NODE_ENV
,process.env.UNI_PLATFORM
这样的变量。 我是看了下uniapp的文档上面这样写的,不清楚是否可行。https://uniapp.dcloud.net.cn/collocation/vite-config.html
process.env.NODE_ENV虽然是可以区分出来是否是正式环境,但是好像实际打包后并不生效,认的是编译后的/src/manifest.json里面的base路径
我自己测了一下,发现process.env.NODE_ENV
是可以解决的。
但是有另外一个问题会导致无法立即生效。
不管manifest.config.ts
中配置的h5.router.base
是什么,只要和manifest.json
不一致,就会按照manifest.json
配置的运行,manifest.config.ts
中配置的无效。
这好像是个运行时序的问题,和环境变量无关,好像是uni的插件先读取的manifest.json
,然后此插件才根据manifest.config.ts
中的修改manifest.json
文件。
你可以连续运行两遍就会发现,process.env.NODE_ENV === 'production'
没啥问题。第一遍运行不生效是因为uni打包读取的是旧的json文件,第二遍生效是因为第一遍已经修改了json文件。
我用官方的模板测试了下,发现存在一样的问题。
根据uniapp的文档https://uniapp.dcloud.net.cn/collocation/vite-config.html,
发布时动态修改 manifest.json
// vite.config.js
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import fs from "node:fs";
import path from "node:path";
import JSON5 from "json5";
const manifestPath = path.resolve(__dirname, "src/manifest.json");
const manifestContent = fs.readFileSync(manifestPath, "utf8");
try {
const manifestJson = JSON5.parse(manifestContent);
manifestJson.h5 = {
...manifestJson.h5,
router: {
...manifestJson.h5?.router,
base: process.env.NODE_ENV === "production" ? "/prod" : "/dev",
},
};
fs.writeFileSync(manifestPath, JSON.stringify(manifestJson, null, 2), "utf8");
} catch (error) {
console.error("Failed to parse manifest.json");
}
// https://vitejs.dev/config/
export default defineConfig({
plugins: [uni()],
});
这个应该是uni的问题。
我能想到的解决方案是在执行uni
命令前,自定义执行一个脚本
// scripts/manifest.ts
import fs from 'node:fs'
import path from 'node:path'
import manifestConfig from '../manifest.config'
fs.writeFileSync(
path.resolve(__dirname, '../src/manifest.json'),
JSON.stringify(manifestConfig, null, 2),
)
// package.json
{
"scripts": {
"dev": "tsx scripts/manifest.ts && uni",
"build": "cross-env NODE_ENV=production tsx scripts/manifest.ts && uni build",
}
}
可以打印啊
onMounted(async () => { console.log('**********>>', process.env.NODE_ENV) })
**>> development
确实有两遍的问题,所以现在编译发布都必须编译2次,不然env配置不生效
对问题的清晰和简明的描述
比如h5里面的base路径,假设我要区分dev和build,这时候就改如何区分
推荐的解决方案
可以增加一个变量用来判断当前是dev还是build
替代方案
No response
额外上下文
No response
检查