uni-helper / vite-plugin-uni-manifest

使用 TypeScript 来编写 uni-app 的 manifest.json
MIT License
13 stars 5 forks source link

这里面如何区分dev和build环境 #32

Open zhenhappy opened 1 month ago

zhenhappy commented 1 month ago

对问题的清晰和简明的描述

比如h5里面的base路径,假设我要区分dev和build,这时候就改如何区分

推荐的解决方案

可以增加一个变量用来判断当前是dev还是build

替代方案

No response

额外上下文

No response

检查

wtto00 commented 1 month ago

vite的环境变量import.meta.env.DEV,import.meta.env.PROD可以吗?

zhenhappy commented 1 month ago

vite的环境变量import.meta.env.DEV,import.meta.env.PROD可以吗?

试了下直接不能运行,import.meta.env.DEV应该是在运行时里面获取的,manifest.config.ts好像拿不到

wtto00 commented 1 month ago

试了下直接不能运行,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

zhenhappy commented 4 weeks ago

试了下直接不能运行,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路径

wtto00 commented 3 weeks ago

我自己测了一下,发现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文件。

wtto00 commented 3 weeks ago

我用官方的模板测试了下,发现存在一样的问题。

根据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的问题。

wtto00 commented 3 weeks ago

我能想到的解决方案是在执行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",
  }
}
foxmale007 commented 1 week ago

可以打印啊 onMounted(async () => { console.log('**********>>', process.env.NODE_ENV) }) **>> development

确实有两遍的问题,所以现在编译发布都必须编译2次,不然env配置不生效