最新文章專題視頻專題問(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
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

webpack多頁(yè)面開(kāi)發(fā)實(shí)踐

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

webpack多頁(yè)面開(kāi)發(fā)實(shí)踐

webpack多頁(yè)面開(kāi)發(fā)實(shí)踐:寫在前面 webpack是一款模塊加載器兼打包工具,能把js,css,頁(yè)面,圖片,視頻等各種資源,進(jìn)行模塊化處理。而現(xiàn)在網(wǎng)上流傳很多單頁(yè)面的webpack模型,那多頁(yè)面呢?比較少,現(xiàn)在我提供一個(gè)多頁(yè)面的前端模型。希望大家適合使用。 在最開(kāi)始接觸webpack的時(shí)
推薦度:
導(dǎo)讀webpack多頁(yè)面開(kāi)發(fā)實(shí)踐:寫在前面 webpack是一款模塊加載器兼打包工具,能把js,css,頁(yè)面,圖片,視頻等各種資源,進(jìn)行模塊化處理。而現(xiàn)在網(wǎng)上流傳很多單頁(yè)面的webpack模型,那多頁(yè)面呢?比較少,現(xiàn)在我提供一個(gè)多頁(yè)面的前端模型。希望大家適合使用。 在最開(kāi)始接觸webpack的時(shí)

寫在前面

webpack是一款模塊加載器兼打包工具,能把js,css,頁(yè)面,圖片,視頻等各種資源,進(jìn)行模塊化處理。而現(xiàn)在網(wǎng)上流傳很多單頁(yè)面的webpack模型,那多頁(yè)面呢?比較少,現(xiàn)在我提供一個(gè)多頁(yè)面的前端模型。希望大家適合使用。

在最開(kāi)始接觸webpack的時(shí)候,我都覺(jué)得webpack只適用于單頁(yè)面應(yīng)用,比如webpack+react,webpack+vue。我自己在使用webpack+vue構(gòu)建項(xiàng)目及開(kāi)發(fā)的過(guò)程中感受到了webpack的強(qiáng)大和方便。基于實(shí)際項(xiàng)目需求,我在想,多頁(yè)面站點(diǎn)是否也能使用webapck來(lái)構(gòu)建呢?于是就開(kāi)始了一番探索,最終算是搭建了一套比較完整的解決方案。

本文以一個(gè)實(shí)際項(xiàng)目為例子,講述在多頁(yè)面項(xiàng)目中如何使用webpack進(jìn)行工程化構(gòu)建。本文是自己的實(shí)踐經(jīng)驗(yàn)總結(jié),所以有些解決方案并不是最優(yōu)的,仍在探索優(yōu)化中,如果有什么錯(cuò)誤紕漏,歡迎指出。

簡(jiǎn)介

本項(xiàng)目主要基于webpack2.x構(gòu)建,以gulp作為輔助工具。前端使用art-template作為模板引擎,一個(gè)頁(yè)面對(duì)應(yīng)一個(gè)模板文件和一個(gè)入口文件,入口文件中可以通過(guò)import或require引入其他模塊,這些模塊webpack會(huì)自動(dòng)跟入口文件合并為一個(gè)文件。

前端開(kāi)發(fā)環(huán)境搭建

主要目錄結(jié)構(gòu)

├─dist #打包后生成的文件目錄
└─src #開(kāi)發(fā)目錄
 ├─components #通用組件
 ├─static #靜態(tài)資源目錄
 │ ├─css
 │ ├─img
 │ └─js
 │ ├─component #站點(diǎn)通用組件對(duì)應(yīng)的js
 │ ├─lib #第三方j(luò)s庫(kù)
 │ ├─services #各頁(yè)面入口
 │ └─util #通用工具js
 ├─template #html模板
 └─views #頁(yè)面
 main.js #公共入口
gulpfile.js #gulp任務(wù)配置
package.json #項(xiàng)目依賴
webpack.config.js #webpack配置

webpack配置

入口文件

// 獲取入口文件
var entries = (function() {
 var jsDir = path.resolve(__dirname, 'src/static/js/services');
 var entryFiles = glob.sync(jsDir + '/*.js');
 var map = {};

 entryFiles.forEach(function(filePath) {
 var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
 map[filename] = filePath;
 });
 return map;
})();

該方法將生成文件名到文件絕對(duì)路徑的map, 比如

entry: {
 'page-1': '/../webpack-multipage-demo/src/static/js/services/page-1.js'
}

熱更新

熱更新簡(jiǎn)直不要太好用,極大地提高了開(kāi)發(fā)效率。

//服務(wù)器配置
var devServer = env === 'production' ? {} : {
 contentBase: path.resolve(__dirname),
 compress: true,
 historyApiFallback: true,
 hot: true,
 inline: true,
 host: 'localhost', 
 port: 8080
};

另外,在plugin中加入new webpack.HotModuleReplacementPlugin(),開(kāi)啟Hot Module Replacemen,即可實(shí)現(xiàn)熱更新。

生成html配置

約定同一頁(yè)面的js文件與模板文件命名一致,最終根據(jù)該js生成與其同名的html文件。

var htmlPages = (function() {
 var artDir = path.resolve(__dirname, 'src/views');
 var artFiles = glob.sync(artDir + '/*.art');
 var array = [];
 artFiles.forEach(function(filePath) {
 var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
 array.push(new HtmlWebpackPlugin({
 template: path.resolve(__dirname, 'src/template/index.html'),
 filename: filename + '.html',
 chunks: ['vendor', 'main', filename],
 chunksSortMode: function(chunk1, chunk2) {
 var order = ['vendor', 'main', filename];
 var order1 = order.indexOf(chunk1.names[0]);
 var order2 = order.indexOf(chunk2.names[0]);
 return order1 - order2;
 },
 minify: {
 removeComments: env === 'production' ? true : false,
 collapseWhitespace: env === 'production' ? true : false
 }
 }));
 });
 return array;
})();

通用模塊提取為組件

對(duì)于一些在多個(gè)頁(yè)面中都需要用到的模塊,可將其提取出來(lái)作為通用的組件。組件的構(gòu)成與頁(yè)面一樣,一個(gè).js文件和一個(gè).art文件以及一個(gè).css文件,在js文件中渲染html內(nèi)容,最后export,使用時(shí)直接require即可。具體實(shí)踐可參考demo

存在問(wèn)題

  1. 每新建一個(gè)頁(yè)面就需要重新啟動(dòng)webpack服務(wù)
  2. 字體文件無(wú)法壓縮,對(duì)于壓縮通過(guò)font-face引入的網(wǎng)絡(luò)字體,目前沒(méi)有找到較好的解決方案

demo

基于本文理論的一個(gè)demo,地址:webpack-multipage-demo

聲明:本網(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

文檔

webpack多頁(yè)面開(kāi)發(fā)實(shí)踐

webpack多頁(yè)面開(kāi)發(fā)實(shí)踐:寫在前面 webpack是一款模塊加載器兼打包工具,能把js,css,頁(yè)面,圖片,視頻等各種資源,進(jìn)行模塊化處理。而現(xiàn)在網(wǎng)上流傳很多單頁(yè)面的webpack模型,那多頁(yè)面呢?比較少,現(xiàn)在我提供一個(gè)多頁(yè)面的前端模型。希望大家適合使用。 在最開(kāi)始接觸webpack的時(shí)
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top