您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何使用webpack打包多頁面,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
項目解決的問題
SPA好復雜,我還是喜歡傳統的多頁應用怎么破?又或是,我司項目需要后端渲染,頁面模板怎么出?
每個頁面相同的UI布局好難維護,UI稍微改一點就要到每個頁面去改,好麻煩還容易漏,怎么破?
能不能整合進ESLint來檢查語法?
能不能整合postcss來加強瀏覽器兼容性?
我可以使用在webpack中使用jquery嗎?
我可以使用在webpack中使用typescript嗎?
src目錄對應dist目錄
當我們使用webpack打包多頁面,我們希望src目錄對應打包后dist目錄是如上圖這樣的,開發根據頁面模塊的思路搭建開發架構,然后經過webpack打包,生成傳統頁面的構架。
/** * 創建打包路徑 */ const createFiles = function() { const usePug = require('../config').usePug; const useTypeScript = require('../config').useTypeScript; const path = require('path'); const glob = require('glob'); const result = []; const type = usePug ? 'pug' : 'html'; const scriptType = useTypeScript ? 'ts' : 'js'; const files = glob.sync(path.join(__dirname, `../src/views/**/*.${type}`)); for (file of files) { result.push({ name: usePug ? file.match(/\w{0,}(?=\.pug)/)[0] : file.match(/\w{0,}(?=\.html)/)[0], templatePath: file, jsPath: file.replace(type, scriptType), stylePath: file.replace(type, 'stylus') }); } return result; };
利用這個方法,我們可以獲得需要打包的文件路徑(方法中獲取文件路徑的模塊也可使用fs模塊),根據獲得打包的文件路徑,我們可以使用html-webpack-plugin
來實現多頁面打包。
由于每一個html-webpack-plugin的對象實例都只針對/生成一個頁面,因此,我們做多頁應用的話,就要配置多個html-webpack-plugin的對象實例:
const plugins = function() { const files = createFiles(); const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); let htmlPlugins = []; let Entries = {}; files.map(file => { htmlPlugins.push( new HtmlWebpackPlugin({ filename: `${file.name}.html`, template: file.templatePath, chunks: [file.name] }) ); Entries[file.name] = file.jsPath; }); return { plugins: [ ...htmlPlugins, new ExtractTextPlugin({ filename: getPath => { return getPath('css/[name].css'); } }) ], Entries }; };
由于我使用了ExtractTextPlugin,因此這些CSS代碼最終都會生成到所屬chunk的目錄里成為一個CSS文件。
模版引擎
每個頁面相同的UI布局好難維護,UI稍微改一點就要到每個頁面去改,好麻煩還容易漏,怎么破?
考慮到這個問題,項目引進并使用了pug
模版引擎。
現在,我們可以利用pug
的特性,創建一個共用組件:
demo.pug
p 這是一個共用組件
然后,當你需要使用這個公用組件時可以引入進來:
include 'demo.pug'
除此之外,你還可以使用一切pug特供的特性。
webpack中配置pug也很簡單,先安裝:
npm i --save-dev pug pug-html-loader
然后將所有.html后綴的改為.pug后綴,并且使用pug語法。
然后在規則中再增加一條配置
{ test: /\.pug$/, use: 'pug-html-loader' }
同時把plugins對象中的用到index.html的HtmlWebpackPlugin中的template,也要改成index.pug。
webpack整合eslint
先放出配置代碼:
if (useEslint) { loaders.push({ test: /\.js$/, loader: 'eslint-loader', enforce: 'pre', include: [path.resolve(__dirname, 'src')], options: { formatter: require('stylish') } }); }
通過webpack整合ESLint,我們可以保證編譯生成的代碼都是沒有語法錯誤且符合編碼規范的;但在開發過程中,等到編譯的時候才察覺到問題可能也是太慢了點兒。
因此我建議可以把ESLint整合進編輯器或IDE里,像我本人在用vs code,就可以使用一個名為Eslint的插件,一寫了有問題的代碼,就馬上會標識出來。
dev環境與prod環境
首先,閱讀webpacl項目的時候通常要先看package.json
這個文件。因為當你在命令行敲下一句命令
npm run dev
webpack就會找到package.json文件中的script屬性并依次分析命令,可見,這句命令相應的會執行
復制代碼 代碼如下:
nodemon --watch build/ --exec \"cross-env NODE_ENV=development webpack-dev-server --color --progress --config build/webpack.dev.js\"
同樣的,當寫下命令
npm run build
script就會執行
ross-env NODE_ENV=production webpack --config build/webpack.prod.js
這樣就能區分開發環境,或是生產環境了。
雖然我們會為環境做區分,但是基于不重復原則,項目為兩個環境公用的配置整合到了(build/webpack.base.js)文件中。然后利用webpack-merge插件將配置整合在一起
webpack中使用jquery
在webpack中使用jquery
也很簡單,我們可以在loaders中增加一條配置:
if (useJquery) { loaders.push({ // 通過require('jquery')來引入 test: require.resolve('jquery'), use: [ { loader: 'expose-loader', // 暴露出去的全局變量的名稱 隨便你自定義 options: 'jQuery' }, { // 同上 loader: 'expose-loader', options: '$' } ] }); }
然后當你需要在某個js文件使用jq時,引用暴露出來的變量名即可:
import $ from 'jQuery';
webpack中使用typescript
在webpack中使用jquery
也很簡單,我們可以在loaders中增加一條配置:
if (useTs) { loaders.push({ test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ }); }
關于如何使用webpack打包多頁面就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。