最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue-CLI多頁(yè)分目錄打包的步驟記錄

 更新時(shí)間:2021年04月15日 11:58:49   作者:鄭小輝  
這篇文章主要給大家介紹了關(guān)于Vue-CLI多頁(yè)分目錄打包的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

頁(yè)面目錄結(jié)構(gòu)

注意需要將默認(rèn)的 html 模板文件 public/index.html  移動(dòng)到根目錄下。

安裝依賴(lài)

npm i --save-dev cross-env tasksfile

build/pages.js

獲取 Vue CLI 需要的多頁(yè)對(duì)象

const path = require('path')
const glob = require('glob')
const fs = require('fs')

const isProduction = process.env.NODE_ENV === 'production'

// 自定義不同模塊的頁(yè)面 title
const titleMap = {
  index: '首頁(yè)'
}

function getPages (globPath) {
  const pages = {}
  glob.sync(globPath).forEach((item) => {
    const stats = fs.statSync(item)
    if (stats.isDirectory()) {
      const basename = path.basename(item, path.extname(item))

      // 如果模塊目錄下有 index.html 則使用該文件為 html 模板文件
      const template = fs.existsSync(`${item}/index.html`)
        ? `${item}/index.html`
        : path.join(__dirname, '../index.html')

      pages[basename] = {
        entry: `${item}/main.js`,
        title: titleMap[basename] || '默認(rèn)頁(yè)面',
        template,
        // 這行代碼很重要
        // 兼容開(kāi)發(fā)和生產(chǎn)時(shí) html 頁(yè)面層級(jí)一致
        filename: isProduction ? 'index.html' : `${basename}/index.html`
      }
    }
  })
  return pages
}

const pages = getPages(path.join(__dirname, '../src/pages/*'))

module.exports = pages

build/index.js

執(zhí)行構(gòu)建命令,循環(huán)執(zhí)行 vue-cli-service build 。

const chalk = require('chalk')
const rimraf = require('rimraf')
const { sh } = require('tasksfile')

const PAGES = require('./pages')

// vue-cli-service --mode 值
const mode = process.env.MODE || 'prod'

// 模塊名,可能為多個(gè)
const moduleNames = process.argv[2]

// 全部頁(yè)面列表
const pageList = Object.keys(PAGES)

// 有效模塊列表 未指定則為全部頁(yè)面列表
const validPageList = moduleNames ? moduleNames.split(',').filter((item) => pageList.includes(item)) : pageList
if (!validPageList.length) {
  console.log(chalk.red('**模塊名不正確**'))
  return
}

console.log(chalk.blue(`有效模塊:${validPageList.join(',')}`))

// 刪除 dist 目錄
rimraf.sync('dist')

console.time('總編譯時(shí)間')
const count = validPageList.length
let current = 0
// 逐個(gè)執(zhí)行模塊編譯
for (let i = 0; i < validPageList.length; i += 1) {
  const moduleName = validPageList[i]
  process.env.MODULE_NAME = moduleName

  console.log(chalk.blue(`${moduleName} 模塊開(kāi)始編譯`))

  // 通過(guò) vue-cli-service build 編譯
  sh(`vue-cli-service build --mode ${mode}`, { async: true }).then(() => {
    console.log(chalk.blue(`${moduleName} 模塊編譯完成`))
    console.log()
    current += 1
    if (current === count) {
      console.log(chalk.blue('-----全部模塊編譯完成-----'))
      console.timeEnd('總編譯時(shí)間')
    }
  })
}

build/dev-modules.js

自定義本地開(kāi)發(fā)時(shí)需要編譯的模塊,模塊名為 src/pages 下的文件夾名。

// 本地開(kāi)發(fā)需要編譯的模塊
module.exports = [

]

vue.config.js

const chalk = require('chalk')

const devModuleList = require('./build/dev-modules')

const isProduction = process.env.NODE_ENV === 'production'

// 總的頁(yè)面
const PAGES = require('./build/pages')

for (const basename in PAGES) {
  if (Object.prototype.hasOwnProperty.call(PAGES, basename)) {
    PAGES[basename].chunks = [
      'chunk-vue',
      'chunk-vendors',
      'chunk-common',
      `${basename}`
    ]
  }
}

let pages = {}
const moduleName = process.env.MODULE_NAME

if (isProduction) {
  // 構(gòu)建模塊的名稱(chēng)
  if (!PAGES[moduleName]) {
    console.log(chalk.red('**模塊名不正確**'))
    return
  }
  pages[moduleName] = PAGES[moduleName]
} else {
  // 本地開(kāi)發(fā)編譯的模塊
  // 編譯全部
  if (process.env.DEV_MODULE === 'all') {
    pages = PAGES
  } else {
    // 編譯部分模塊
    const moduleList = [
      // 固定編譯的模塊
      'index',
      'login',
      // 自定義編譯的模塊
      ...devModuleList
    ]
    moduleList.forEach(item => {
      pages[item] = PAGES[item]
    })
  }
}

module.exports = {
  // 這行代碼很重要
  publicPath: isProduction ? './' : '/',
  pages,
  // 這行代碼很重要
  outputDir: isProduction ? `dist/${moduleName}` : 'dist',
  productionSourceMap: false,
  css: {
    loaderOptions: {
      sass: {
        prependData: '@import "~@/styles/variables.scss";'
      }
    }
  },
  chainWebpack: (config) => {
    config.optimization.splitChunks({
      cacheGroups: {
        vue: {
          name: 'chunk-vue',
          test: /[\\/]node_modules[\\/]_?(vue|vue-router|vuex|element-ui)(@.*)?[\\/]/,
          priority: -1,
          chunks: 'initial'
        },
        vendors: {
          name: 'chunk-vendors',
          test: /[\\/]node_modules[\\/]/,
          priority: -10,
          chunks: 'initial'
        },
        common: {
          name: 'chunk-common',
          minChunks: 2,
          priority: -20,
          chunks: 'initial',
          reuseExistingChunk: true
        }
      }
    })
  }
}

package.json

{
  "scripts": {
    "serve": "vue-cli-service serve",
    "serve:all": "cross-env DEV_MODULE=all vue-cli-service serve",
    "build:test": "cross-env MODE=test node build/index.js",
    "build:prod": "cross-env MODE=prod node build/index.js",
    "lint": "vue-cli-service lint",
  }
}

本地開(kāi)發(fā)

本地開(kāi)發(fā)時(shí),npm run serve 會(huì)編譯自定義的模塊目錄,npm run serve:all 會(huì)編譯全部模塊目錄。

本地開(kāi)發(fā)時(shí)編譯后的目錄結(jié)構(gòu)如下:

所以啟動(dòng)后,需要將地址改為 http://localhost:8080/index/index.html

打包結(jié)果

構(gòu)建時(shí), npm run build:prod 打包全部頁(yè)面,npm run build:prod index 僅打包 index 頁(yè)面。

打包后的目錄結(jié)構(gòu)如下:

這樣在不同模塊之間跳轉(zhuǎn)時(shí),可以使用一致的相對(duì)路徑跳轉(zhuǎn)方式, ../index/index.html 。

打包后每個(gè)模塊的內(nèi)容打包到一個(gè)單獨(dú)目錄下。

Github 地址

總結(jié)

到此這篇關(guān)于Vue-CLI多頁(yè)分目錄打包的文章就介紹到這了,更多相關(guān)Vue-CLI多頁(yè)分目錄打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中圖片的引用方式的區(qū)別詳解

    Vue中圖片的引用方式的區(qū)別詳解

    在?Vue?開(kāi)發(fā)中,圖片的引用方式主要取決于圖片存放的位置,一般有四種常用的存放方式,本文將詳細(xì)分析這些方式的區(qū)別,并提供完整的代碼示例,希望對(duì)大家有所幫助
    2025-02-02
  • vue使用keep-alive實(shí)現(xiàn)組件切換時(shí)保存原組件數(shù)據(jù)方法

    vue使用keep-alive實(shí)現(xiàn)組件切換時(shí)保存原組件數(shù)據(jù)方法

    這篇文章主要介紹了vue使用keep-alive實(shí)現(xiàn)組件切換時(shí)保存原組件數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • 深入理解Vue官方文檔梳理之全局API

    深入理解Vue官方文檔梳理之全局API

    本篇文章主要介紹了深入理解Vue官方文檔梳理之全局API,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • vue實(shí)現(xiàn)在data里引入相對(duì)路徑

    vue實(shí)現(xiàn)在data里引入相對(duì)路徑

    這篇文章主要介紹了vue實(shí)現(xiàn)在data里引入相對(duì)路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • VUE中對(duì)object.object和object[object]的使用解讀

    VUE中對(duì)object.object和object[object]的使用解讀

    這篇文章主要介紹了VUE中對(duì)object.object和object[object]的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Vue computed計(jì)算屬性是什么

    詳解Vue computed計(jì)算屬性是什么

    在vue中,有時(shí)候你需要對(duì)data中的數(shù)據(jù)進(jìn)行處理,或者對(duì)抓取的數(shù)據(jù)進(jìn)行處理之后再掛載呈現(xiàn)到標(biāo)簽中,這時(shí)候你就需要計(jì)算屬性了,當(dāng)然看到這里你可能還是不了解那下面我舉幾個(gè)實(shí)例并附代碼解釋
    2023-03-03
  • nuxt+axios解決前后端分離SSR的示例代碼

    nuxt+axios解決前后端分離SSR的示例代碼

    這篇文章主要介紹了nuxt+axios解決前后端分離SSR的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Vue3使用KeepAlive不生效的解決方法

    Vue3使用KeepAlive不生效的解決方法

    使用arco-design-pro的vue3后臺(tái)框架, 切換路由時(shí), 組件包裹的keepAlive不生效, 切換tab后組件狀態(tài)會(huì)刷新, 并重新獲取接口, 導(dǎo)致頁(yè)面切換時(shí)閃爍,所以本文給大家介紹了Vue3使用KeepAlive不生效的解決方法,需要的朋友可以參考下
    2024-11-11
  • vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解

    vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解

    這篇文章主要介紹了vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Vue實(shí)現(xiàn)選項(xiàng)卡tab切換制作

    Vue實(shí)現(xiàn)選項(xiàng)卡tab切換制作

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)選項(xiàng)卡tab切換制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

日喀则市| 鄂伦春自治旗| 清河县| SHOW| 赤峰市| 宁安市| 海安县| 德兴市| 灯塔市| 银川市| 望城县| 玉环县| 仁怀市| 班戈县| 曲阳县| 年辖:市辖区| 星座| 沅江市| 天峻县| 木兰县| 子洲县| 江华| 龙南县| 拉萨市| 蛟河市| 兴业县| 桃园县| 吉木萨尔县| 含山县| 南阳市| 贵港市| 晋宁县| 广宁县| 江陵县| 丹江口市| 固原市| 米易县| 库车县| 钟祥市| 上高县| 聂拉木县|