<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

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

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:55:44
        文檔

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

        Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用:前言 首先我們可以把多頁(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 ,那么同樣其
        推薦度:
        導(dǎo)讀Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用:前言 首先我們可以把多頁(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è)應(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í)依賴的一個(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 }

      1. 以上我們?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)縮小輸出。
      2. html-minifier 是一款用于縮小 html 文件大小的工具,其有很多配置項(xiàng)功能,包括上述所列舉的常用的刪除注釋、空白、引號(hào)等。
      3. 當(dāng)我們編寫完了多模板的方法后,我們同樣可以在 vue.config.js 中進(jìn)行配置,與多入口不同的是我們?cè)?configureWebpack 中不能直接替換 plugins 的值,因?yàn)樗€包含了其他插件
      4. /* 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` // 并且如果找不到的話,就回退到 `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é)

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁(yè)應(yīng)用:前言 首先我們可以把多頁(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 ,那么同樣其
        推薦度:
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top 主站蜘蛛池模板: 又粗又黄又猛又爽大片免费| 三年片在线观看免费观看大全动漫| 免费看片在线观看| 亚洲高清在线视频| 午夜不卡久久精品无码免费| 亚洲视频一区调教| 日韩免费无码视频一区二区三区| 久久精品7亚洲午夜a| 未满十八18禁止免费无码网站| 亚洲AV无码久久精品成人 | 成人免费无码精品国产电影| 亚洲AV无码无限在线观看不卡 | 一区二区三区无码视频免费福利| 亚洲精品国偷自产在线| 国产精品免费无遮挡无码永久视频| 亚洲Av永久无码精品三区在线| 最近免费2019中文字幕大全| 国产成人精品日本亚洲11| 青青草国产免费久久久91 | 巨胸喷奶水www永久免费| 亚洲成年轻人电影网站www| 日韩在线免费视频| 久久亚洲精品无码av| 亚洲人午夜射精精品日韩| 永久免费av无码入口国语片| 亚洲精品中文字幕无乱码麻豆| 四虎影视永久免费观看地址| 一级做a爰性色毛片免费| 亚洲人成电影在在线观看网色| 成人AV免费网址在线观看| 精品久久久久亚洲| 亚洲国产精品一区第二页| 国产精品怡红院永久免费| 疯狂做受xxxx高潮视频免费| 亚洲AV无一区二区三区久久| 成年人免费网站在线观看| 一级女性全黄生活片免费看| 亚洲天堂中文字幕在线观看| 免费中文字幕一级毛片| 24小时在线免费视频| 美女视频黄a视频全免费网站一区|