欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue單頁(yè)面改造多頁(yè)面應(yīng)用的全過(guò)程記錄

 更新時(shí)間:2022年05月05日 12:43:26   作者:長(zhǎng)衫罩子龍  
眾所都知vue是一個(gè)單頁(yè)面應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于vue單頁(yè)面改造多頁(yè)面應(yīng)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

單頁(yè)面和多頁(yè)面的區(qū)別這里就不細(xì)說(shuō)了。我司業(yè)務(wù)適合多頁(yè)面,許多小應(yīng)用都是通過(guò)iframe整體嵌入的形式。

  • 如果項(xiàng)目過(guò)于龐大,就會(huì)有很不好的體驗(yàn)問(wèn)題。
  • 拆分多個(gè)項(xiàng)目的話,又會(huì)有額外的開(kāi)支,如服務(wù)器資源部署等問(wèn)題。

基于此改造的目標(biāo)

  • 單獨(dú)業(yè)務(wù)邏輯單獨(dú)一個(gè)頁(yè)面
  • 可實(shí)現(xiàn)單命令打包
  • 可單獨(dú)打包

首先我們準(zhǔn)備一個(gè)基礎(chǔ)的項(xiàng)目

目錄結(jié)構(gòu)如下

src目錄為我們平時(shí)開(kāi)發(fā)的目錄,dist為打包后的目錄,整體結(jié)構(gòu)如圖

1 將當(dāng)前項(xiàng)目改造成多頁(yè)面目錄

pages下為我們開(kāi)發(fā)的目錄文件,改造過(guò)程就是將原src下所有目錄結(jié)構(gòu)復(fù)制到home,index每個(gè)頁(yè)面單獨(dú)一份 為了提現(xiàn)多頁(yè)面優(yōu)勢(shì),這里我們選用兩款ui框架,以便最后做下打包體積對(duì)比

npm i element-ui -S
npm i ant-design-vue -S

在home和index中分別引入

home頁(yè)面類似,然后我們更改vue.config.js

module.exports = {
  publicPath: './',
  productionSourceMap: false,
  pages: { // vue cli3 自帶多頁(yè)面配置
    index: {
      entry: `src/pages/index/main.js`,
      template: `public/index.html`,
      filename: `index.html`
    },
    home: {
      entry: `src/pages/home/main.js`,
      template: `public/index.html`,
      filename: `home.html`
    }
  },
  devServer: {
    port: 8080
  },
  lintOnSave: false
}

現(xiàn)在我們打包,看一下生成的目錄結(jié)構(gòu)

  File                                   Size              Gzipped

  dist\js\chunk-vendors.239e820f.js      2544.36 KiB       703.20 KiB
  dist\js\index.1716ccad.js              11.33 KiB         4.13 KiB
  dist\js\home.e4410a07.js               7.08 KiB          2.57 KiB
  dist\js\about.ca80b2fc.js              0.76 KiB          0.29 KiB
  dist\css\chunk-vendors.68b49edf.css    666.01 KiB        89.04 KiB
  dist\css\index.5dfa7415.css            0.45 KiB          0.28 KiB
  dist\css\home.d995708f.css             0.44 KiB          0.27 KiB

  Images and other types of assets omitted.
  Build at: 2022-05-01T12:26:06.551Z - Hash: 693bf5bdcf72896b - Time: 16240ms

 DONE  Build complete. The dist directory is ready to be deployed.
 INFO  Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html

可以看到打包出來(lái)的是混在一起的。我們下一步就是將他們拆分開(kāi),并且可配置命令單獨(dú)打包 思路是循環(huán)pages下文件夾 我們找出pages下目錄中帶有main.js的所有文件夾名。當(dāng)然我們也可以手動(dòng)寫死,每次增加頁(yè)面的時(shí)候,我們單獨(dú)維護(hù)這個(gè)數(shù)組

const pages = ['home', 'index'] // 在增加頁(yè)面的時(shí)候,手動(dòng)維護(hù)這個(gè)數(shù)組

當(dāng)然我們也有方法可以幫我們維護(hù)這個(gè)數(shù)組,可以在我們更新的時(shí)候省事一些

// 獲取pages下文件夾
const path = require('path')
const glob = require('glob')
// 找到pages所在文件夾 hello-world\src\pages
const PATH_ENTRY = path.resolve(__dirname, '../src/pages')
// 匹配到pages路徑下 main.js 的文件
// [
//   'D:/測(cè)試項(xiàng)目/hello-world/src/pages/home/main.js',
//   'D:/測(cè)試項(xiàng)目/hello-world/src/pages/index/main.js'
// ]
const entryFilePaths = glob.sync(PATH_ENTRY + '/**/main.js')

const buildEntries = []
entryFilePaths.forEach((filePath) => {
  // 找到對(duì)應(yīng)的文件名,index  home
  const FILENAME = filePath.match(/([^/]+)\/main\.js$/)[1]
  buildEntries.push(FILENAME)
})
module.exports = {
  buildEntries
}

buildEntries 既為我們拿到的數(shù)組

現(xiàn)在我們繼續(xù)改造vue.config.js, 我們先通過(guò)更改package.json中的命令傳參的形式,根據(jù)我們傳遞的參數(shù),單獨(dú)打包對(duì)應(yīng)的page

"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:index": "vue-cli-service build index --no-clean", // 注意no-clean 不能清除文件,不然可能將文件夾下打包的其他page清理掉,如果是每次部署一個(gè)page,這就無(wú)所謂了
    "build:home": "vue-cli-service build home --no-clean",
    "build:prod": "vue-cli-service build",
    "_build": "node build/build.js",
    "lint": "vue-cli-service lint"
 }

我們?nèi)绾文苣玫?傳入的index 或者h(yuǎn)ome參數(shù)呢 結(jié)果是process.argv這個(gè)參數(shù)中可以取到,具體可以自行搜索下 process.argv為一個(gè)數(shù)組,第一項(xiàng)為可執(zhí)行文件的目錄 第二項(xiàng)為當(dāng)前執(zhí)行的JavaScript文件路徑 剩余的是傳遞的參數(shù),就如我們傳遞的index 是在process.argv[3]中 現(xiàn)將vue.config.js改造如下

// 編譯配置的多頁(yè)面
const modules = {}
const isProduction = process.env.NODE_ENV === 'production'
const { buildEntries } = require('./config/getPages')

// 初始化頁(yè)面參數(shù)
function initPageParams(page) {
  modules[ page ] = {
    entry: `src/pages/${page}/main.js`, // page 的入口
    template: `public/index.html`, // 模板來(lái)源
    filename: `${page}.html`, // 在 dist/index.html 的輸出
  }
}

const page = process.argv[3] || 'index'
// 如果是 開(kāi)發(fā)環(huán)境,運(yùn)行階段
if (!isProduction) {
  for (const page of buildEntries) {
    initPageParams(page)
  }
} else {
  // 只有在生產(chǎn)打包的時(shí)候,單獨(dú)打包,拆成不用的文件夾
  initPageParams(page)
}

module.exports = {
  publicPath: './',
  outputDir: 'dist',
  assetsDir: isProduction ? page : 'static',
  productionSourceMap: false,
  pages: modules,
  devServer: {
    port: 8080
  },
  lintOnSave: false
}

這時(shí)候我們npm run build:index 嘗試查看打包結(jié)果,可以看到,可以將index對(duì)應(yīng)的文件全部放在index文件目錄下,如果我們需要打包home,直接npm run build:home

 File                                      Size             Gzipped

  dist\index\js\chunk-vendors.c60bfe2f.j    1837.82 KiB      527.87 KiB
  s
  dist\index\js\index.e2aa144d.js           11.28 KiB        4.12 KiB
  dist\index\js\about.2a86a3cb.js           0.43 KiB         0.28 KiB
  dist\index\css\chunk-vendors.ef376986.    456.88 KiB       55.99 KiB
  css
  dist\index\css\index.5dfa7415.css         0.45 KiB         0.28 KiB

  Images and other types of assets omitted.
  Build at: 2022-05-03T03:46:54.824Z - Hash: e2d53105a245deab - Time: 12711ms

 DONE  Build complete. The dist directory is ready to be deployed.
 INFO  Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html

現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了,單獨(dú)page單獨(dú)打包,但我們?nèi)绻?,一個(gè)命令打包所有的page呢。這個(gè)時(shí)候我們就需要node一個(gè)方法來(lái)幫助我們實(shí)現(xiàn)了 我們?cè)趩为?dú)建一個(gè)js文件代碼如下

const fs = require('fs');
const execSync = require('child_process').execSync;
const { buildEntries } = require('../config/getPages');

// 移除目錄
function deleteDist(path) {
  let files = [];
  // 判斷目錄是否存在
  if (fs.existsSync(path)) {
    files = fs.readdirSync(path); // 讀取目錄
    // @ts-ignore
    files.forEach((file) => {
      const curPath = path + '/' + file; // 拼接目錄寫文件完整路徑
      if (fs.statSync(curPath).isDirectory()) { // 讀取文件路徑狀態(tài) 判斷是否為文件夾 如果為文件夾,遞歸
        deleteDist(curPath);
      } else {
        fs.unlinkSync(curPath); // 刪除文件
      }
    });
    fs.rmdirSync(path);
  }
}
try {
  const startTime = Date.now();
  process.env.NODE_ENV = 'production';  // 切換環(huán)境為生產(chǎn)
  // 執(zhí)行打包前刪除dist目錄
  deleteDist('./dist');
  for (const page of buildEntries) {
    // 可以執(zhí)行我們的命令,第一個(gè)參數(shù)是命令,第二個(gè)參數(shù)的意思是輸出子進(jìn)程中的日志
    execSync(`vue-cli-service build ${page} --no-clean`, { stdio: 'inherit' });
  }
  // 重置
  process.env.NODE_ENV = undefined;
  const time = Date.now() - startTime;
  console.log('\033[42;30m ALL DONE \033[0m Build Compiled successfully in ' + `${time / 1000}s`);
} catch (e) {
  console.log('\033[41;30m FAILED \033[0m ' + e);
}

思想就是循環(huán)執(zhí)行打包命令 關(guān)鍵在于execSync方法來(lái)替我們執(zhí)行打包命令,現(xiàn)在我們執(zhí)行,npm run _build

至此我們的多頁(yè)面打包基本完成,后續(xù)也可以做一些cdn的處理,或者chunks的拆包等優(yōu)化。小伙伴們自行研究

總結(jié)

到此這篇關(guān)于vue單頁(yè)面改造多頁(yè)面應(yīng)用的文章就介紹到這了,更多相關(guān)vue單頁(yè)面改造多頁(yè)面內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Vue中導(dǎo)入并讀取Excel數(shù)據(jù)的操作步驟

    在Vue中導(dǎo)入并讀取Excel數(shù)據(jù)的操作步驟

    在工作中遇到需要前端上傳excel文件獲取到相應(yīng)數(shù)據(jù)處理之后傳給后端并且展示上傳文件的數(shù)據(jù),所以本文就來(lái)給大家介紹一下Vue中導(dǎo)入并讀取Excel數(shù)據(jù)的操作步驟,需要的朋友可以參考下
    2023-08-08
  • 在vue中通過(guò)axios異步使用echarts的方法

    在vue中通過(guò)axios異步使用echarts的方法

    本篇文章主要介紹了在vue中通過(guò)axios異步使用echarts的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Vue2.0 實(shí)現(xiàn)移動(dòng)端圖片上傳功能

    Vue2.0 實(shí)現(xiàn)移動(dòng)端圖片上傳功能

    本文主要介紹VUE2.0圖片上傳功能的實(shí)現(xiàn)。原理是通過(guò)js控制和input標(biāo)簽的方式完成這一效果,無(wú)需加載其他組件。具體實(shí)例大家大家參考下本文
    2018-05-05
  • 如何解決element-ui動(dòng)態(tài)加載級(jí)聯(lián)選擇器默認(rèn)選中問(wèn)題

    如何解決element-ui動(dòng)態(tài)加載級(jí)聯(lián)選擇器默認(rèn)選中問(wèn)題

    這篇文章主要介紹了如何解決element-ui動(dòng)態(tài)加載級(jí)聯(lián)選擇器默認(rèn)選中問(wèn)題,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • Vue模板語(yǔ)法中數(shù)據(jù)綁定的實(shí)例代碼

    Vue模板語(yǔ)法中數(shù)據(jù)綁定的實(shí)例代碼

    這篇文章主要介紹了Vue模板語(yǔ)法中數(shù)據(jù)綁定的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • vue中關(guān)于$emit和$on的使用及說(shuō)明

    vue中關(guān)于$emit和$on的使用及說(shuō)明

    這篇文章主要介紹了vue中關(guān)于$emit和$on的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 前端Vue項(xiàng)目詳解--初始化及導(dǎo)航欄

    前端Vue項(xiàng)目詳解--初始化及導(dǎo)航欄

    這篇文章主要介紹了前端Vue項(xiàng)目詳解--初始化及導(dǎo)航欄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • 詳解關(guān)于Vue單元測(cè)試的幾個(gè)坑

    詳解關(guān)于Vue單元測(cè)試的幾個(gè)坑

    這篇文章主要介紹了關(guān)于Vue單元測(cè)試的幾個(gè)坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • vue2封裝input組件方式(輸入的雙向綁定)

    vue2封裝input組件方式(輸入的雙向綁定)

    這篇文章主要介紹了vue2封裝input組件方式(輸入的雙向綁定),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-04-04
  • Vue3?接入?i18n?實(shí)現(xiàn)國(guó)際化多語(yǔ)言案例分析

    Vue3?接入?i18n?實(shí)現(xiàn)國(guó)際化多語(yǔ)言案例分析

    在?Vue.js?3?中實(shí)現(xiàn)網(wǎng)頁(yè)的國(guó)際化多語(yǔ)言,最常用的包是?vue-i18n,通常我們會(huì)與?vue-i18n-routing?一起使用,這篇文章主要介紹了Vue3?如何接入?i18n?實(shí)現(xiàn)國(guó)際化多語(yǔ)言,需要的朋友可以參考下
    2024-07-07

最新評(píng)論