基于 vue-cli 2 实现,vue 支持多模块项目

基于 vue-cli 2 实现,vue 多模块、vue多项目集成工程

 

业务场景

1.如果项目可能有对应多个不同UI界面;对于这样的场景你可能首先会想到,用样式主题就可以实现,基本的样式或者换肤是可以通过样式实现。但如果要实现更复杂的,比如不同两套UI的界面可能功能显示及样式都有差别,那就不得不单独拆成一个项目,但是这样又会造成每个项目很多冗余代码。

2.如果项目有多个子模块(同时子模块之间又存在互相依赖关系);对于这样的场景是可以把项目独立发布到npm仓库,但是这样又涉及到每个模块都需要独立编译好再发布,实际过程有显得有些繁琐(实际视情况而定)。

对于以上场景可以使用一个项目管理多个子模块也是一个不错的选择。

 

疑问

  1. 多页面:多页面是指一个项目有多个入口,打包是会生成多个html文件,实际开发过程中都是混合在一个项目中开发;
  2. 多模块:是指不同的业务模块可以进行拆分;各自独立运行、也可以互相引用,这一点和通过 npm 发布是类似的;对于一些项目本身不允许发布的情况下,既可以独立开发,又不需要发布到共有仓库(当然也可以通过建立私有仓库解决哈)

 

解决思路

如何划分子模块;

如何分离可复用组件;

如何独立编译,每个子模块独立打包编译、运行;

 

优点

  1. 高复用性
  2. 统一管理依赖库
  3. 不同模块使用的依赖各自按需打包
  4. 模块之间相互独立运行、编译、打包
  5. 模块之间可以直接互相引用,不需要iframe(一般方式是通过iframe嵌入,这样的性能相当差)

 

实现

项目结构

Github项目地址

build:编译、运行相关脚本文件

config:编译、运行相关配置文件

static:不需要编译的静态资源,放到对应的模块目录下

        子模块1

        子模块2

         ...

src:项目源码

        comm:公共模块

                script:公共js文件

                components:公共组件

        子模块1:

                assets:样式、图片等资源文件

                common:业务相关的公共文件

                components:业务组件

                router:路由配置

                store:vuex相关

                views:页面视图

        子模块2:

        子模块3:

                ...

修改配置

1.增加 config/multi.conf.js 多模块配置文件

const path = require('path')
const argvs = process.argv.slice(2)

function resolve(dir) {
  return path.join(__dirname, '..', dir)
}

function getParams(key) {
  let item = argvs.find(item => item.split('=')[0] === key)
  return item ? item.split('=') : []
}

function getModuleAlias() {
  let alias = {}
  importModules.forEach(name => {
    alias[`@${name}`] = resolve(`src/${name}`)
  })
  return alias
}

function getModuleProcess(name) {
  if (!importModules.includes(name)) {
    name = importModules[0]
  }
  return {
    name,
    entry: ["babel-polyfill", `./src/${name}/main.js`],
    alias: resolve(`src/${name}`),
    index: path.resolve(__dirname, `../dist/${name}/index.html`),
    assetsRoot: path.resolve(__dirname, `../dist/${name}/`)
  }
}

// 多项目配置
var importModules = ['project1', 'project2', 'project3']
var lifecycleEvents = String(process.env.npm_lifecycle_event).split(':')
var moduleName = getParams('name')[1] || lifecycleEvents[1]

const multiConfig = {
  modules: importModules,
  moduleAlias: getModuleAlias(),
  process: getModuleProcess(moduleName)
}

module.exports = multiConfig

2.修改 build/webpack.base.conf.js 文件

const multiConfig = require('../config/multi.conf')

// ...省略

module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: multiConfig.process.entry,
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@comm': resolve(`src/comm`),
      '@': multiConfig.process.alias,
      ...multiConfig.moduleAlias
    }
  },
  // ...省略
}

3.增加 build/zip.js 文件,用于打包.zip

const pack = require('../package.json')
const path = require('path')
const FileManagerPlugin = require('filemanager-webpack-plugin')
const XEUtils = require('xe-utils')
const multiConfig = require('../config/multi.conf')
const argvs = process.argv.slice(2)

function getParams (key) {
  let item = argvs.find(item => item.split('=')[0] === key)
  return item ? item.split('=') : []
}

let datetime = XEUtils.toDateString(Date.now(), 'yyyyMMddHHmmss')
let plugins = []

let zipPros = getParams('zip')
if (zipPros.length) {
  plugins.push(new FileManagerPlugin({
    onEnd: {
      delete: [
        path.join(__dirname, `../${pack.name}_${multiConfig.process.name}_*.zip`)
      ],
      archive: [{
        source: path.join(__dirname, `../dist/${multiConfig.process.name}`),
        destination: path.join(__dirname, zipPros[1] ? `../${pack.name}_${zipPros[1]}.zip` : `../${pack.name}_${multiConfig.process.name}_${pack.version}_${datetime}.zip`)
      }]
    }
  }))
}

module.exports = plugins

4.修改 config/index.js 文件

{
    // ...省略
  },

  build: {
    // Template for index.html
    index: multiConfig.process.index,

    // Paths
    assetsRoot: multiConfig.process.assetsRoot,
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    // ...省略
  }
}

5.修改 package.json 文件,增加独立运行脚本

  "scripts": {
    // ...省略
    "dev:project1": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "dev:project2": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "dev:project3": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    // ...省略
  },

6.修改 package.json 文件,增加独立编译脚本

  "scripts": {
    // ...省略
    "build:project1": "node build/build.js name=project1",
    "build:project2": "node build/build.js name=project2",
    "build:project3": "node build/build.js name=project3",
    // ...省略
  },

7.修改 package.json 文件,增加独立打包脚本

  "scripts": {
    // ...省略
    "build:project1:zip": "node build/build.js name=project1 zip",
    "build:project2:zip": "node build/build.js name=project2 zip",
    "build:project3:zip": "node build/build.js name=project3 zip",
    // ...省略
  },

开始使用

1.单个模块启动

npm run dev:project1

npm run dev:project2

npm run dev:project3

2.多模块同时启动

点击右下角的拆分终端按钮,可以同时启动多个模块

3.模块按需、独立编译

npm run build:project1

npm run build:project2

npm run build:project3

 

4.模块按需、独立打包

npm run build:project1:zip

npm run build:project2:zip

npm run build:project3:zip

 

查看项目

 

到此就完了,又愉快的玩耍了哈!

 

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
vue-cli-service build是一个用于构建Vue项目的命令。它是通过调用vue-cli-service模块来执行构建操作的。具体来说,vue-cli-service指令作为入口文件,被node.exe调用,并将运行参数传递给Service服务模块。该命令会编译和打包Vue项目的源代码,生成用于部署的最终版本。它会将Vue组件、JavaScript文件、CSS样式等打包成静态资源文件,以便在浏览器中运行。通过执行vue-cli-service build命令,您可以生成一个用于生产环境的优化、压缩的Vue项目。请确保您已经按照相应的依赖和配置进行安装和设置,以便成功执行该命令。 vue-cli-service lint是用于代码风格检查的命令。lint命令通过调用vue-cli-service模块,使用ESLint工具对Vue项目的代码进行静态分析,以确保代码符合指定的编码规范。它会检查代码中的潜在错误、不规范的代码风格以及其他一些代码质量问题,并提供相应的提示和警告。通过执行vue-cli-service lint命令,您可以检查和修复代码中的潜在问题,以提高代码的可读性和可维护性。请注意,使用lint命令之前,您需要在项目中配置相应的ESLint规则和配置文件。 总结起来,vue-cli-service build用于构建Vue项目,将源代码打包成可部署的静态资源文件,而vue-cli-service lint用于代码风格检查,帮助您确保代码符合指定的编码规范。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vue serve及其与vue-cli-service serve之间的关系](https://blog.csdn.net/pulledup/article/details/126950958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值