Vue3+Vite多项目多dist打包操作实现方式

 更新时间:2025年12月04日 08:42:05   作者:竭点  
本文介绍了如何使用Vue3和Vite搭建多项目环境,并在打包时生成多个dist包,通过创建主项目环境、配置多个dist包、以及执行打包操作,可以实现多个子项目的独立管理

在前端开发中,Vue 3 和 Vite 已经成为了越来越受欢迎的工具。其中,Vite 作为一个快速构建工具,与 Vue 3 结合使用,可以提高开发效率和性能。

在实际项目中,一个项目会包含多个子项目,需要达成多个子项目的dist包。本文将介绍如何使用 Vue 3 + Vite 搭建多项目环境,并在打包时生成多个 dist 包。

1. 创建一个主项目环境

使用命令,快速创建一个住项目的环境

npm create vue@latest

2. 子项目目录

3. 子项目文件

在两个子项目中分别创建App.vue和main.js文件

我这里的代码直接使用vue创建时的代码,需要改的地方是资源,文件的路径

App.vue

```javascript
<script setup>
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from '../../components/HelloWorld.vue'
</script>

<template>
  <header>
    <img alt="Vue logo" class="logo" src="../../assets/logo.svg" width="125" height="125" />

    <div class="wrapper">
      <HelloWorld msg="You did it!" />

      <nav>
        <RouterLink to="/">Home</RouterLink>
        <RouterLink to="/about">About</RouterLink>
      </nav>
    </div>
  </header>

  <RouterView />
</template>

<style scoped>
header {
  line-height: 1.5;
  max-height: 100vh;
}

.logo {
  display: block;
  margin: 0 auto 2rem;
}

nav {
  width: 100%;
  font-size: 12px;
  text-align: center;
  margin-top: 2rem;
}

nav a.router-link-exact-active {
  color: var(--color-text);
}

nav a.router-link-exact-active:hover {
  background-color: transparent;
}

nav a {
  display: inline-block;
  padding: 0 1rem;
  border-left: 1px solid var(--color-border);
}

nav a:first-of-type {
  border: 0;
}

@media (min-width: 1024px) {
  header {
    display: flex;
    place-items: center;
    padding-right: calc(var(--section-gap) / 2);
  }

  .logo {
    margin: 0 2rem 0 0;
  }

  header .wrapper {
    display: flex;
    place-items: flex-start;
    flex-wrap: wrap;
  }

  nav {
    text-align: left;
    margin-left: -1rem;
    font-size: 1rem;

    padding: 1rem 0;
    margin-top: 1rem;
  }
}
</style>

main.js

import '../../assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from '../../router'

const app = createApp(App)

app.use(createPinia())
app.use(router)

app.mount('#app')

然后在于index.html同级的地方添加两个对应子项目 的html,如果项目的title,图标一致,可以直接用index.html,不需要新建html文件

projecta.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico" rel="external nofollow" >
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>项目Ap</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/projects/projectA/main.js"></script>
  </body>
</html>

4. 配置多个 dist 包

新建projectConfig.js,存放子项目的入口配置

export const configMap = {
    projectA:{
      minify: true,
      pages: [
          {
              filename: 'projecta', // filename 默认是template文件名,就是beijing.html
              entry: 'src/projects/projectA/main.js',
              template: 'projecta.html',
          },   
      ],
    },
    projectB:{
      minify: true,
      pages: [
          {
              filename: 'projectb',
              entry: 'src/projects/proiectB/main.js',
              template: 'projectb.html',
          },
      ],
    }
  }
  

然后修改vite.config.js如下:

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { createHtmlPlugin } from 'vite-plugin-html';
import { resolve } from 'node:path';
import { configMap } from './projectConfig'

const projectName = process.env.PROJECT_NAME
export default defineConfig({
    base: './',             // 方便打包后预览
    publicDir: 'public',    // 默认 public
    plugins: [
        vue(),
        createHtmlPlugin(configMap[projectName])
    ],
    resolve:{
      alias:{
        '@':resolve(__dirname,'src')
      }
    },
    build: 
        {
            cssCodeSplit: true,
            emptyOutDir: true,
            sourcemap: false,
            assetsDir: 'assets', // 默认 assets
            outDir: `dist-${projectName}`, // 输出到dist
            rollupOptions: {
                input: {
                },
                output: {
                    compact: true,
                    entryFileNames: "assets/js/[name]-[hash].js",
                    chunkFileNames: "assets/js/[name]-[hash].js",
                    assetFileNames: "assets/[ext]/[name].[ext]",
                }
            }
        },
        
})

package.json文件也需要重新修改scripts部分,主要实现npm run build打出多个dist包

package.json

  "scripts": {
    "dev": "vite",
    "build": "node dynamic-build-all.js",
    "preview": "vite preview"
  },

dynamic-build-all.js:

import { projects } from './projects.js';
import { execSync } from 'child_process';
const projectNames = Object.keys(projects);
for (const projectName of projectNames) {
  console.log(`Building ${projectName}...`);
  const command = projects[projectName].buildCommand;
  execSync(command, { stdio: 'inherit' });
}

projects.js存放项目配置

export const projects = {
    projectA: {
      name: "projectA",
      buildCommand: "cross-env PROJECT_NAME=projectA vite build",
      desc: "协议一"
    },
    projectB: {
      name: "projectB",
      buildCommand: "cross-env PROJECT_NAME=projectB vite build",
      desc: "协议二"
    }
}

5. 打包操作

多个包的配置已经完善,直接执行打包命令即可

npm run build

通过以上操作,我们可以轻松地在 Vue 3 + Vite 环境下管理多个项目,并通过配置不同的 Vite 配置文件来生成多个独立的 dist 包。

这样,我们可以更加灵活地进行项目管理和部署。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue 的全选组件封装你知道多少

    vue 的全选组件封装你知道多少

    这篇文章主要为大家详细介绍了vue的全选组件封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Vue实例挂载的全流程详解

    Vue实例挂载的全流程详解

    理解 Vue 实例的挂载过程,不仅有助于我们更好地掌握 Vue 的核心原理,还能提高我们在开发中的调试和优化能力,下面就跟随小编一起学习一下吧
    2024-12-12
  • 详解如何使用vue实现可视化界面设计

    详解如何使用vue实现可视化界面设计

    Vue是一款流行的前端开发框架,它的响应式数据绑定和组件化特性使得它成为了可视化界面设计的一个理想选择,本文将介绍如何使用Vue实现可视化界面设计,并且演示一个基于Vue的可视化界面设计案例,需要的朋友可以参考下
    2023-12-12
  • vue实现简单无缝滚动效果

    vue实现简单无缝滚动效果

    这篇文章主要为大家详细介绍了vue实现简单无缝滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用

    Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用

    这篇文章主要介绍了 Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 快速解决Error: error:0308010C:digital envelope routines::unsupported的三种解决方案

    快速解决Error: error:0308010C:digital envelope ro

    因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,下面通过本文给大家分享快速解决Error: error:0308010C:digital envelope routines::unsupported的三种解决方案,感兴趣的朋友一起看看吧
    2024-02-02
  • vue项目使用定时器每隔几秒运行一次某方法代码实例

    vue项目使用定时器每隔几秒运行一次某方法代码实例

    有时候在项目中我们经常需要设置简单的倒计时功能,这个可以通过定时器来实现,下面这篇文章主要给大家介绍了关于vue项目使用定时器每隔几秒运行一次某方法的相关资料,需要的朋友可以参考下
    2023-04-04
  • vue开发移动端h5环境搭建的全过程

    vue开发移动端h5环境搭建的全过程

    在正式使用Vue进行移动端页面开发前,需要做一些前置工作,下面这篇文章主要给大家介绍了关于vue开发移动端h5环境搭建的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • vue在body和query中如何向后端传参

    vue在body和query中如何向后端传参

    这篇文章主要介绍了vue在body和query中如何向后端传参,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue.JS项目中5个经典Vuex插件

    Vue.JS项目中5个经典Vuex插件

    在本文中,将向你展示5个特性,你可以通过 Vuex 插件轻松地添加到下一个项目中。一起来学习下。
    2017-11-11

最新评论