Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
2 tasks done
zhenhappy opened this issue Aug 16, 2024 · 10 comments
Open
2 tasks done

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

zhenhappy opened this issue Aug 16, 2024 · 10 comments

Comments

@zhenhappy
Copy link

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

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

推荐的解决方案

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

替代方案

No response

额外上下文

No response

检查

  • 遵循我们的 行为准则
  • 检查是否已经有一个要求相同功能的问题,以避免重复创建。
@wtto00
Copy link
Contributor

wtto00 commented Aug 16, 2024

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

@zhenhappy
Copy link
Author

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

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

@wtto00
Copy link
Contributor

wtto00 commented Aug 16, 2024

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

zhenhappy commented Aug 16, 2024

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

@zhenhappy zhenhappy reopened this Aug 17, 2024
@wtto00
Copy link
Contributor

wtto00 commented Aug 19, 2024

我自己测了一下,发现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
Copy link
Contributor

wtto00 commented Aug 19, 2024

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

根据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
Copy link
Contributor

wtto00 commented Aug 19, 2024

我能想到的解决方案是在执行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
Copy link

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

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

@pot-code
Copy link

pot-code commented Dec 4, 2024

@wtto00 要是配置方式可以改为像 vite 一样支持函数式定义就好了,可以拿到当前 build mode 然后载入不同的 env 文件实现不同的配置项

@KeJunMao
Copy link
Member

uni 在 vite 启动前就依赖 manifest.json,这个插件能做到的很有限,除非找到或 uni 提供 cli 级别的钩子

@wtto00 要是配置方式可以改为像 vite 一样支持函数式定义就好了,可以拿到当前 build mode 然后载入不同的 env 文件实现不同的配置项

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants