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

Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用

 更新時(shí)間:2019年06月02日 09:23:48   作者:Poetry’s Blog  
這篇文章主要給大家介紹了關(guān)于Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue CLI3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

首先我們可以把多頁(yè)應(yīng)用理解為由多個(gè)單頁(yè)構(gòu)成的應(yīng)用,而何謂多個(gè)單頁(yè)呢?其實(shí)你可以把一個(gè)單頁(yè)看成是一個(gè) html 文件,那么多個(gè)單頁(yè)便是多個(gè) html 文件,多頁(yè)應(yīng)用便是由多個(gè) html 組成的應(yīng)用,如下圖所示


既然多頁(yè)應(yīng)用擁有多個(gè) html ,那么同樣其應(yīng)該擁有多個(gè)獨(dú)立的入口文件、組件、路由、 vuex 等。沒(méi)錯(cuò),說(shuō)簡(jiǎn)單一點(diǎn)就是多頁(yè)應(yīng)用的每個(gè)單頁(yè)都可以擁有單頁(yè)應(yīng)用 src 目錄下的文件及功能,我們來(lái)看一下一個(gè)基礎(chǔ)多頁(yè)應(yīng)用的目錄結(jié)構(gòu)

├── node_modules               # 項(xiàng)目依賴(lài)包目錄
├── build                      # 項(xiàng)目 webpack 功能目錄
├── config                     # 項(xiàng)目配置項(xiàng)文件夾
├── src                        # 前端資源目錄
│   ├── images                 # 圖片目錄
│   ├── components             # 公共組件目錄
│   ├── pages                  # 頁(yè)面目錄
│   │   ├── page1              # page1 目錄
│   │   │   ├── components     # page1 組件目錄
│   │   │   ├── router         # page1 路由目錄
│   │   │   ├── views          # page1 頁(yè)面目錄
│   │   │   ├── page1.html     # page1 html 模板
│   │   │   ├── page1.vue      # page1 vue 配置文件
│   │   │   └── page1.js       # page1 入口文件
│   │   ├── page2              # page2 目錄
│   │   └── index              # index 目錄
│   ├── common                 # 公共方法目錄
│   └── store                  # 狀態(tài)管理 store 目錄
├── .gitignore                 # git 忽略文件
├── .env                       # 全局環(huán)境配置文件
├── .env.dev                   # 開(kāi)發(fā)環(huán)境配置文件
├── .postcssrc.js              # postcss 配置文件
├── babel.config.js            # babel 配置文件
├── package.json               # 包管理文件
├── vue.config.js              # CLI 配置文件
└── yarn.lock                  # yarn 依賴(lài)信息文件

二、多入口

在單頁(yè)應(yīng)用中,我們的入口文件只有一個(gè), CLI 默認(rèn)配置的是 main.js ,但是到了多頁(yè)應(yīng)用,我們的入口文件便包含了 page1.js 、 page2.js 、 index.js 等,數(shù)量取決于 pages 文件夾下目錄的個(gè)數(shù),這時(shí)候?yàn)榱隧?xiàng)目的可拓展性,我們需要自動(dòng)計(jì)算入口文件的數(shù)量并解析路徑配置到 webpack 中的 entry 屬性上,如:

module.exports = {
 ...
 
 entry: {
  page1: '/xxx/pages/page1/page1.js',
  page2: '/xxx/pages/page2/page2.js',
  index: '/xxx/pages/index/index.js',
 },
 
 ...
}

那么我們?nèi)绾巫x取并解析這樣的路徑呢,這里就需要使用工具和函數(shù)來(lái)解決了。我們可以在根目錄新建 build 文件夾存放 utils.js 這樣共用的 webpack 功能性文件,并加入多入口讀取解析方法

/* utils.js */
const path = require('path');

// glob 是 webpack 安裝時(shí)依賴(lài)的一個(gè)第三方模塊,該模塊允許你使用 * 等符號(hào),
// 例如 lib/*.js 就是獲取 lib 文件夾下的所有 js 后綴名的文件
const glob = require('glob');

// 取得相應(yīng)的頁(yè)面路徑,因?yàn)橹暗呐渲茫允?src 文件夾下的 pages 文件夾
const PAGE_PATH = path.resolve(__dirname, '../src/pages');

/* 
* 多入口配置
* 通過(guò) glob 模塊讀取 pages 文件夾下的所有對(duì)應(yīng)文件夾下的 js * 后綴文件,如果該文件存在
* 那么就作為入口處理
*/
exports.getEntries = () => {
 let entryFiles = glob.sync(PAGE_PATH + '/*/*.js') // 同步讀取所有入口文件
 let map = {}
 
 // 遍歷所有入口文件
 entryFiles.forEach(filePath => {
  // 獲取文件名
  let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
  
  // 以鍵值對(duì)的形式存儲(chǔ)
  map[filename] = filePath 
 })
 
 return map
}

讀取并存儲(chǔ)完畢后,我們得到了一個(gè)入口文件的對(duì)象集合,這個(gè)對(duì)象我們便可以將其設(shè)置到 webpack 的 entry 屬性上,這里我們需要修改 vue.config.js 的配置來(lái)間接修改 webpack 的值

/* vue.config.js */

const utils = require('./build/utils')

module.exports = {
 ...
 
 configureWebpack: config => {
  config.entry = utils.getEntries()
 },
 
 ...
}

這樣我們多入口的設(shè)置便完成了,當(dāng)然這并不是 CLI 所希望的操作,后面我們會(huì)進(jìn)行改進(jìn)。

三、多模板

相對(duì)于多入口來(lái)說(shuō),多模板的配置也是大同小異,這里所說(shuō)的模板便是每個(gè) page 下的 html 模板文件,而模板文件的作用主要用于 webpack 中 html-webpack-plugin 插件的配置,其會(huì)根據(jù)模板文件生產(chǎn)一個(gè)編譯后的 html 文件并自動(dòng)加入攜帶 hash 的腳本和樣式,基本配置如下

/* webpack 配置文件 */
const HtmlWebpackPlugin = require('html-webpack-plugin') // 安裝并引用插件

module.exports = {
 ...
 
 plugins: [
  new HtmlWebpackPlugin({
   title: 'My Page', // 生成 html 中的 title
   filename: 'demo.html', // 生成 html 的文件名
   template: 'xxx/xxx/demo.html', // 模板路徑
   chunks: ['manifest', 'vendor', 'demo'], // 所要包含的模塊
   inject: true, // 是否注入資源
  })
 ]
 
 ...
}

以上是單模板的配置,那么如果是多模板只要繼續(xù)往 plugins 數(shù)組中添加 HtmlWebpackPlugin 即可,但是為了和多入口一樣能夠靈活的獲取 pages 目錄下所有模板文件并進(jìn)行配置,我們可以在 utils.js 中添加多模板的讀取解析方法

/* utils.js */

// 多頁(yè)面輸出配置
// 與上面的多頁(yè)面入口配置相同,讀取 page 文件夾下的對(duì)應(yīng)的 html 后綴文件,然后放入數(shù)組中
exports.htmlPlugin = configs => {
 let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
 let arr = []
 
 entryHtml.forEach(filePath => {
  let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
  let conf = {
   template: filePath, // 模板路徑
   filename: filename + '.html', // 生成 html 的文件名
   chunks: ['manifest', 'vendor', filename],
   inject: true,
  }
  
  // 如果有自定義配置可以進(jìn)行 merge
  if (configs) {
   conf = merge(conf, configs)
  }
  
  // 針對(duì)生產(chǎn)環(huán)境配置
  if (process.env.NODE_ENV === 'production') {
   conf = merge(conf, {
    minify: {
     removeComments: true, // 刪除 html 中的注釋代碼
     collapseWhitespace: true, // 刪除 html 中的空白符
     // removeAttributeQuotes: true // 刪除 html 元素中屬性的引號(hào)
    },
    chunksSortMode: 'manual' // 按 manual 的順序引入
   })
  }
  
  arr.push(new HtmlWebpackPlugin(conf))
 })
 
 return arr
}

  • 以上我們?nèi)匀皇鞘褂?glob 讀取所有模板文件,然后將其遍歷并設(shè)置每個(gè)模板的 config ,同時(shí)針對(duì)一些自定義配置和生產(chǎn)環(huán)境的配置進(jìn)行了 merge 處理,其中自定義配置的功能我會(huì)在下節(jié)進(jìn)行介紹,這里介紹一下生產(chǎn)環(huán)境下 minify 配置的作用:將 html-minifier 的選項(xiàng)作為對(duì)象來(lái)縮小輸出。
  • html-minifier 是一款用于縮小 html 文件大小的工具,其有很多配置項(xiàng)功能,包括上述所列舉的常用的刪除注釋、空白、引號(hào)等。
  • 當(dāng)我們編寫(xiě)完了多模板的方法后,我們同樣可以在 vue.config.js 中進(jìn)行配置,與多入口不同的是我們?cè)?configureWebpack 中不能直接替換 plugins 的值,因?yàn)樗€包含了其他插件
/* vue.config.js */

const utils = require('./build/utils')

module.exports = {
 ...
 
 configureWebpack: config => {
  config.entry = utils.getEntries() // 直接覆蓋 entry 配置
  
  // 使用 return 一個(gè)對(duì)象會(huì)通過(guò) webpack-merge 進(jìn)行合并,plugins 不會(huì)置空
  return {
   plugins: [...utils.htmlPlugin()]
  }
 },
 
 ...
}

如此我們多頁(yè)應(yīng)用的多入口和多模板的配置就完成了,這時(shí)候我們運(yùn)行命令 yarn build 后你會(huì)發(fā)現(xiàn) dist 目錄下生成了 3 個(gè) html 文件,分別是 index.html 、 page1.html 和 page2.html

四、使用 pages 配置

其實(shí),在 vue.config.js 中,我們還有一個(gè)配置沒(méi)有使用,便是 pages 。 pages 對(duì)象允許我們?yōu)閼?yīng)用配置多個(gè)入口及模板,這就為我們的多頁(yè)應(yīng)用提供了開(kāi)放的配置入口。官方示例代碼如下

/* vue.config.js */
module.exports = {
 pages: {
  index: {
   // page 的入口
   entry: 'src/index/main.js',
   // 模板來(lái)源
   template: 'public/index.html',
   // 在 dist/index.html 的輸出
   filename: 'index.html',
   // 當(dāng)使用 title 選項(xiàng)時(shí),
   // template 中的 title 標(biāo)簽需要是 <title><%= htmlWebpackPlugin.options.title %></title>
   title: 'Index Page',
   // 在這個(gè)頁(yè)面中包含的塊,默認(rèn)情況下會(huì)包含
   // 提取出來(lái)的通用 chunk 和 vendor chunk。
   chunks: ['chunk-vendors', 'chunk-common', 'index']
  },
  // 當(dāng)使用只有入口的字符串格式時(shí),
  // 模板會(huì)被推導(dǎo)為 `public/subpage.html`
  // 并且如果找不到的話(huà),就回退到 `public/index.html`。
  // 輸出文件名會(huì)被推導(dǎo)為 `subpage.html`。
  subpage: 'src/subpage/main.js'
 }
}

我們不難發(fā)現(xiàn), pages 對(duì)象中的 key 就是入口的別名,而其 value 對(duì)象其實(shí)是入口 entry 和模板屬性的合并,這樣我們上述介紹的獲取多入口和多模板的方法就可以合并成一個(gè)函數(shù)來(lái)進(jìn)行多頁(yè)的處理,合并后的 setPages 方法如下

// pages 多入口配置
exports.setPages = configs => {
 let entryFiles = glob.sync(PAGE_PATH + '/*/*.js')
 let map = {}

 entryFiles.forEach(filePath => {
  let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
  let tmp = filePath.substring(0, filePath.lastIndexOf('\/'))

  let conf = {
   // page 的入口
   entry: filePath, 
   // 模板來(lái)源
   template: tmp + '.html', 
   // 在 dist/index.html 的輸出
   filename: filename + '.html', 
   // 頁(yè)面模板需要加對(duì)應(yīng)的js腳本,如果不加這行則每個(gè)頁(yè)面都會(huì)引入所有的js腳本
   chunks: ['manifest', 'vendor', filename], 
   inject: true,
  };

  if (configs) {
   conf = merge(conf, configs)
  }

  if (process.env.NODE_ENV === 'production') {
   conf = merge(conf, {
    minify: {
     removeComments: true, // 刪除 html 中的注釋代碼
     collapseWhitespace: true, // 刪除 html 中的空白符
     // removeAttributeQuotes: true // 刪除 html 元素中屬性的引號(hào)
    },
    chunksSortMode: 'manual'// 按 manual 的順序引入
   })
  }

  map[filename] = conf
 })

 return map
}

上述代碼我們 return 出的 map 對(duì)象就是 pages 所需要的配置項(xiàng)結(jié)構(gòu),我們只需在 vue.config.js 中引用即可

/* vue.config.js */

const utils = require('./build/utils')

module.exports = {
 ...
 
 pages: utils.setPages(),
 
 ...
}

這樣我們多頁(yè)應(yīng)用基于 pages 配置的改進(jìn)就大功告成了,當(dāng)你運(yùn)行打包命令來(lái)查看輸出結(jié)果的時(shí)候,你會(huì)發(fā)現(xiàn)和之前的方式相比并沒(méi)有什么變化,這就說(shuō)明這兩種方式都適用于多頁(yè)的構(gòu)建,但是這里還是推薦大家使用更便捷的 pages 配置

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • vue跳轉(zhuǎn)頁(yè)面常用的幾種方法匯總

    vue跳轉(zhuǎn)頁(yè)面常用的幾種方法匯總

    這篇文章主要介紹了vue跳轉(zhuǎn)頁(yè)面常用的幾種方法匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • vue3組件的v-model:value與v-model的區(qū)別解析

    vue3組件的v-model:value與v-model的區(qū)別解析

    在Vue3中,v-model和v-model:value都是用于實(shí)現(xiàn)雙向數(shù)據(jù)綁定的語(yǔ)法糖,但v-model:value提供了更顯式和靈活的綁定方式,允許你明確指定綁定的屬性名和事件名,它們的主要區(qū)別在于默認(rèn)行為、靈活性、多模型綁定和使用場(chǎng)景,感興趣的朋友一起看看吧
    2025-02-02
  • 在vue中created、mounted等方法使用小結(jié)

    在vue中created、mounted等方法使用小結(jié)

    這篇文章主要介紹了在vue中created、mounted等方法使用小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • vue.js中npm安裝教程圖解

    vue.js中npm安裝教程圖解

    這篇文章主要介紹了vue.js中npm安裝教程圖解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04
  • Vue實(shí)現(xiàn)手機(jī)計(jì)算器

    Vue實(shí)現(xiàn)手機(jī)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)手機(jī)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • VUE Token的失效處理詳解

    VUE Token的失效處理詳解

    這篇文章主要為大家介紹了VUE Token的失效處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Vue加載中動(dòng)畫(huà)組件使用方法詳解

    Vue加載中動(dòng)畫(huà)組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue加載中動(dòng)畫(huà)組件使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 解決vue的component標(biāo)簽渲染問(wèn)題

    解決vue的component標(biāo)簽渲染問(wèn)題

    這篇文章主要介紹了解決vue的component標(biāo)簽渲染問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 使用Axios攔截器中止Vue請(qǐng)求的步驟詳解

    使用Axios攔截器中止Vue請(qǐng)求的步驟詳解

    假設(shè)?App?的用戶(hù)可以在短時(shí)間內(nèi)進(jìn)行多個(gè)?API?調(diào)用,但您只想顯示上次調(diào)用的結(jié)果,之前正在進(jìn)行的請(qǐng)求變得無(wú)關(guān)緊要,在這種情況下,您可以利用?Axios?攔截器,本文給大家介紹了如何使用Axios攔截器中止Vue請(qǐng)求,需要的朋友可以參考下
    2023-11-11
  • 基于Vue el-autocomplete 實(shí)現(xiàn)類(lèi)似百度搜索框功能

    基于Vue el-autocomplete 實(shí)現(xiàn)類(lèi)似百度搜索框功能

    本文通過(guò)代碼給大家介紹了Vue el-autocomplete 實(shí)現(xiàn)類(lèi)似百度搜索框功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

阿克苏市| 启东市| 巴楚县| 黔东| 安国市| 灵石县| 玛曲县| 酒泉市| 宜兰市| 久治县| 伊金霍洛旗| 祁东县| 株洲县| 融水| 汕尾市| 靖安县| 彰化县| 城固县| 收藏| 滕州市| 科技| 博客| 正定县| 绍兴县| 开封市| 神木县| 竹北市| 芦山县| 金阳县| 西贡区| 临汾市| 友谊县| 晋江市| 杭州市| 莲花县| 仁化县| 宿迁市| 沾化县| 淄博市| 库尔勒市| 玉门市|