webpack多頁(yè)面開發(fā)實(shí)踐
寫在前面
webpack是一款模塊加載器兼打包工具,能把js,css,頁(yè)面,圖片,視頻等各種資源,進(jìn)行模塊化處理。而現(xiàn)在網(wǎng)上流傳很多單頁(yè)面的webpack模型,那多頁(yè)面呢?比較少,現(xiàn)在我提供一個(gè)多頁(yè)面的前端模型。希望大家適合使用。
在最開始接觸webpack的時(shí)候,我都覺得webpack只適用于單頁(yè)面應(yīng)用,比如webpack+react,webpack+vue。我自己在使用webpack+vue構(gòu)建項(xiàng)目及開發(fā)的過程中感受到了webpack的強(qiáng)大和方便?;趯?shí)際項(xiàng)目需求,我在想,多頁(yè)面站點(diǎn)是否也能使用webapck來構(gòu)建呢?于是就開始了一番探索,最終算是搭建了一套比較完整的解決方案。
本文以一個(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è)入口文件,入口文件中可以通過import或require引入其他模塊,這些模塊webpack會(huì)自動(dòng)跟入口文件合并為一個(gè)文件。
前端開發(fā)環(huán)境搭建
主要目錄結(jié)構(gòu)
├─dist #打包后生成的文件目錄 └─src #開發(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)直不要太好用,極大地提高了開發(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(),開啟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è)面中都需要用到的模塊,可將其提取出來作為通用的組件。組件的構(gòu)成與頁(yè)面一樣,一個(gè).js文件和一個(gè).art文件以及一個(gè).css文件,在js文件中渲染html內(nèi)容,最后export,使用時(shí)直接require即可。具體實(shí)踐可參考demo
存在問題
- 每新建一個(gè)頁(yè)面就需要重新啟動(dòng)webpack服務(wù)
- 字體文件無法壓縮,對(duì)于壓縮通過font-face引入的網(wǎng)絡(luò)字體,目前沒有找到較好的解決方案
demo
基于本文理論的一個(gè)demo,地址:webpack-multipage-demo
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ListBox實(shí)現(xiàn)上移,下移,左移,右移的簡(jiǎn)單實(shí)例
這篇文章主要介紹了ListBox實(shí)現(xiàn)上移,下移,左移,右移的簡(jiǎn)單實(shí)例。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-02-02
JavaScript獲取字符串實(shí)際長(zhǎng)度(包含中英文)
這篇文章介紹了JavaScript獲取字符串實(shí)際長(zhǎng)度(包含中英文)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
JavaScrip報(bào)錯(cuò):module?is?not?defined的原因及解決
這篇文章主要給大家介紹了關(guān)于JavaScrip報(bào)錯(cuò):module?is?not?defined的原因及解決方法,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
微信小程序開發(fā)之表單驗(yàn)證WxValidate使用
本文主要介紹了微信小程序開發(fā)之表單驗(yàn)證WxValidate使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

