uniapp+ts 多环境编译

  1. 创建项目
bash 复制代码
npx degit dcloudio/uni-preset-vue#vite-ts [项目名称]

2.创建env目录

多环境配置文件命名为.env.别名

添加index.d.ts

TypeScript 复制代码
interface ImportMetaEnv{
	readonly VITE_ENV:string,
	readonly UNI_PLATFORM:string,
	readonly VITE_APPID:string,
	readonly VITE_NAME:string
	readonly VITE_VERSION:string
	readonly VITE_API_BASE_URL:string
}

interface ImportMeta{
	readonly env:ImportMetaEnv;
}

3.修改vite.config.ts

TypeScript 复制代码
import { defineConfig, loadEnv,type PluginOption } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import {resolve } from 'path'
import { copyToDeployDir } from "./post-build-plugin";
import { modifyVersion } from "./version-plugin";

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd()+"/env", ['VITE_']);

  return {
    envDir:resolve(__dirname, 'env'),
    plugins: [
      modifyVersion(mode,env),
      uni(),
      copyToDeployDir(mode,env)
    ],
    
    resolve:{
      alias:{
        '@':resolve(__dirname, 'src')
      }
    }
  }
});

post-build-plugin.ts文件内容为:

TypeScript 复制代码
import {  loadEnv,type PluginOption } from "vite";
import {resolve } from 'path';
import fs from 'fs-extra';

//拷贝到发布目录
export function copyToDeployDir(mode: string,baseEnv :Record<string,string>) : PluginOption {
  return{
    name: 'copy-to-deploy',
    enforce: 'post',
    async  closeBundle() {
      try{
        if (!baseEnv.VITE_NAME) {
          throw new Error('VITE_NAME environment variable is not defined');
        }

        const nodeEnv = baseEnv.VITE_USER_NODE_ENV == "development" ? "dev":"build";

        // 路径安全处理
        const sourceDir = resolve(__dirname, 'dist');
        const destDir = resolve(__dirname, 'deploy', baseEnv.VITE_NAME);

        await fs.copy(sourceDir, destDir, { overwrite: true });
        console.log(`✅ 文件已复制到: ${destDir}`);

        if(baseEnv.VITE_PLATFORM =="mp-toutiao"){
          await createPackageFile(destDir, nodeEnv, baseEnv);
        }
        await updateProjectFile(destDir, nodeEnv, baseEnv);
      } catch (error) {
        console.error('❌ 文件复制失败:', error instanceof Error ? error.message : error);
        process.exit(1); // 构建失败时退出
      }
    }
  }
}

//创建package.json文件
async function createPackageFile(destDir:string, nodeEnv:string, env:Record<string,string>){
  const filePath = resolve(destDir, nodeEnv, env.VITE_PLATFORM,"package.json")
  const content = "{\"industrySDK\": true}";
  await fs.writeFile(filePath, content);
  console.log(`✅ package.json文件已创建`);
}

//更新项目 appid ,项目名称
async function updateProjectFile(destDir:string, nodeEnv:string,env:Record<string,string>){
  const filePath = resolve(destDir, nodeEnv, env.VITE_PLATFORM,"project.config.json")
  const content = fs.readFileSync(filePath, 'utf8');
  const newContent = content.replace('TT_APPID', env.VITE_APPID).replace('TT_NAME',env.VITE_NAME);
  console.log(newContent)
  await fs.writeFile(filePath, newContent);
}

4.编译命令执行

bash 复制代码
pnpm run dev:mp-toutiao-别名

注:package.json中需将编译命令添加

bash 复制代码
"dev:mp-toutiao-别名": "uni -p mp-toutiao --mode 别名",

5.完整多环境配置工程

playlet: uniapp + typescript + pina 创建小程序,支持多环境导出小程序

相关推荐
起这个名字几秒前
LangGraphJs 核心概念、工作流程理解及应用
前端·人工智能
小赵同学WoW1 分钟前
vue组件基础知识
前端
牛奶10 分钟前
浏览器藏了这么多神器,你居然不知道?
前端·chrome·api
WebInfra15 分钟前
Rspack 2.0 正式发布!
前端·javascript·前端框架
极速蜗牛22 分钟前
Cursor最近变傻了?
前端
码字小学妹32 分钟前
Claude Opus 4.7 接入指南(2026):国内配置 + xhigh 推理 + 成本计算
前端
小赵同学WoW34 分钟前
插槽【vue2】与 【vue3】对比
前端
代码随想录34 分钟前
Agent大厂面试题汇总:ReAct、Function Calling、MCP、RAG高频问题
前端·react.js·前端框架
前端那点事34 分钟前
Vue响应式原理|从底层实现到面试考点,一文吃透(Vue2+Vue3全解析)
前端·vue.js
walking95736 分钟前
Vite 打包优化终极指南:从 30MB 到 800KB 的性能飞跃
前端·vue.js·vite