詳解webpack+ES6+Sass搭建多頁(yè)面應(yīng)用
webpack同之前的gulp相比,gulp屬于非模塊化打包工具,webpack屬于模塊化打包工具,兩者的優(yōu)劣這里不做過(guò)多分析(可自行百度)。
目的:是為了分享一下使用過(guò)程中,用到的插件、loader、遇到的各種問(wèn)題以及解決辦法,最后會(huì)附上最終代碼。
在這個(gè)項(xiàng)目中,用 webpack打包c(diǎn)ss、scss、js、圖片文件、jquery、第三方插件、字體圖標(biāo),編譯es6、壓縮html、壓縮js、壓縮css ,基本涵蓋了常用的東西。
代碼結(jié)構(gòu)如下
下面單獨(dú)說(shuō)幾個(gè)難點(diǎn)
1、打包多頁(yè)面,使用到的插件是html-wepack-plugin , html-loader ,也就是你有多少個(gè)頁(yè)面,就有多少個(gè)入口,也就寫(xiě)多少個(gè)模版文件。當(dāng)然,頁(yè)面過(guò)多時(shí),可以考慮遍歷處理。
//引入路徑插件 const path = require('path'); //引入導(dǎo)出html插件 const HtmlWebpackPlugin = require('html-webpack-plugin'); const config = { //入口 entry:{ home:'./pages/lawSearchHomepage.js', list:'./pages/lawSearchList.js' }, //出口 output:{ filename: '[name].bundle.js', path: path.resolve(__dirname,'build') }, //插件 plugins: [ //html單獨(dú)導(dǎo)出插件——首頁(yè) new HtmlWebpackPlugin({ filename:'lawSearchHomepage.html',//輸出后的文件名稱 template:'./pages/lawSearchHomepage.html',//模版頁(yè)面路徑 favicon:'./pages/images/favicon.ico',//頁(yè)簽圖標(biāo) chunks:['home'],//需要引入的js文件名稱 inject: true, hash:true,//哈希值 minify: {//壓縮 removeComments: true, collapseWhitespace: true } }), //html單獨(dú)導(dǎo)出插件——列表頁(yè) new HtmlWebpackPlugin({ filename:'lawSearchList.html', template:'./pages/lawSearchList.html', favicon:'./pages/images/favicon.ico', chunks:['list'], inject: true, hash:true, minify: { removeComments: true, collapseWhitespace: true } }) ] } module.exports = config;
2、單獨(dú)打包c(diǎn)ss,使用到的插件extract-text-webpack-plugin ,loader有style-loader、css-loader、sass-loader、node-sass,因?yàn)槊總€(gè)頁(yè)面要引入相對(duì)應(yīng)的css文件,所以,在js入口文件里通過(guò)require('./lawSearchHomepage.scss')引如對(duì)應(yīng)的scss文件,打包后css文件會(huì)單獨(dú)打包,并通過(guò)link的形式引入html
//引入導(dǎo)出css插件 const ExtractTextPlugin = require('extract-text-webpack-plugin'); //loader {//CSS test:/\.css/, use:ExtractTextPlugin.extract({ use:['css-loader'] }) }, {//Sass test:/\.scss/, use:ExtractTextPlugin.extract({ fallback:"style-loader", use:['css-loader','sass-loader'] },) } //plugins //將css單獨(dú)打包插件 new ExtractTextPlugin({ filename:"[name].css",//制定編譯后的文件名稱 allChunks:true,//把分割的塊分別打包 }),
3、處理es6,安裝babel、babel-loader@7(因?yàn)橄旅鎵嚎sjs,其他版本報(bào)錯(cuò))、babel-core、babel-preset-es2015(也是為了解決壓縮js報(bào)錯(cuò))
//loader {//ES6 test:/\.js$/, loader:'babel-loader', // exclude:__dirname+'node_modules',//不對(duì)這個(gè)進(jìn)行babel轉(zhuǎn)換,這里邊已經(jīng)打包好,這樣能減少打包時(shí)間 // include:__dirname+'src'這里的src是你要編譯的js文件的目錄, exclude:path.resolve(__dirname,'node_modules'), include:path.resolve(__dirname,'pages'), query:{//若在package.json中定義了這個(gè)presets,則這邊可以刪掉 presets:['es2015'] } },
4、處理jquery,安裝expose-loader
第一種方法可以通過(guò)在js里require('expose-loader?$!jquery');引入jquery
第二種通過(guò)loader
//loader {//Jquery test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] },
5、壓縮css,使用插件optimize-css-assets-webpack-plugin,安裝cssnano
//引入壓縮css的插件 const optimizeCss = require('optimize-css-assets-webpack-plugin'); //引入cssnano插件 const cssnano = require('cssnano'); //plugins plugins:[ new optimizeCss({ assetNameRegExp: /\.style\.css$/g, cssProcessor: cssnano, cssProcessorOptions: { discardComments: { removeAll: true } }, canPrint: true }), ], //壓縮優(yōu)化css,不寫(xiě)這個(gè)css還是沒(méi)壓縮,不知道為啥 optimization: { // minimize: true, minimizer: [new optimizeCss({})] },
6、壓縮js,一般的情況下,js默認(rèn)就是壓縮狀態(tài),但是在壓縮完css后,js就不是壓縮的了,所以還是處理一下,編譯更快
用的插件uglifyjs-webpack-plugin
//引入js壓縮插件 const uglifyjs = require('uglifyjs-webpack-plugin'); //plugins new uglifyJs()
我的package.json中安裝的插件
"devDependencies": { "babel": "^6.23.0", "babel-core": "^6.26.3", "babel-loader": "^7.1.5", "babel-preset-es2015": "^6.24.1", "clean-webpack-plugin": "^0.1.19", "css-loader": "^1.0.0", "cssnano": "^4.1.7", "expose-loader": "^0.7.5", "extract-text-webpack-plugin": "^4.0.0-beta.0", "file-loader": "^2.0.0", "font-awesome-webpack": "^0.0.5-beta.2", "html-loader": "^0.5.5", "html-webpack-plugin": "^3.2.0", "jquery": "^3.3.1", "node-sass": "^4.9.4", "optimize-css-assets-webpack-plugin": "^5.0.1", "postcss-loader": "^3.0.0", "sass-loader": "^7.1.0", "style-loader": "^0.23.1", "typeahead.js": "^0.11.1", "uglifyjs-webpack-plugin": "^2.0.1", "url-loader": "^1.1.2", "webpack": "^4.23.1", "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.10" }
webpack.config.js里的代碼(完整版)
//引入路徑插件 const path = require('path'); //引入導(dǎo)出html插件 const HtmlWebpackPlugin = require('html-webpack-plugin'); //引入清除插件 const CleanWebpackPlugin = require('clean-webpack-plugin'); //引入導(dǎo)出css插件 const ExtractTextPlugin = require('extract-text-webpack-plugin'); //引入webpack const webpack = require('webpack'); //引入壓縮css的插件 const optimizeCss = require('optimize-css-assets-webpack-plugin'); //引入cssnano插件 const cssnano = require('cssnano'); //引入js壓縮插件 const uglifyjs = require('uglifyjs-webpack-plugin'); //webpack配置內(nèi)容 const config = { //入口 entry:{ home:'./pages/lawSearchHomepage.js', list:'./pages/lawSearchList.js' }, //便于調(diào)試 devtool:'inline-source-map', //服務(wù) devServer:{ contentBase:'./build/lawSearchHomepage.html' }, //loader模塊 module:{ rules: [ {//ES6 test:/\.js$/, loader:'babel-loader', // exclude:__dirname+'node_modules',//不對(duì)這個(gè)進(jìn)行babel轉(zhuǎn)換,這里邊已經(jīng)打包好,這樣能減少打包時(shí)間 // include:__dirname+'src'這里的src是你要編譯的js文件的目錄, exclude:path.resolve(__dirname,'node_modules'), include:path.resolve(__dirname,'pages'), query:{//若在package.json中定義了這個(gè)presets,則這邊可以刪掉 presets:['es2015'] } }, {//Jquery test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }, {//CSS test:/\.css/, use:ExtractTextPlugin.extract({ use:['css-loader'] }) }, {//Sass test:/\.scss/, use:ExtractTextPlugin.extract({ fallback:"style-loader", use:['css-loader','sass-loader'] },) }, {//處理模塊html test: /\.html$/, use: 'html-loader' }, {//圖片 test: /\.(jpg|png|gif)$/, use: { loader: 'file-loader', options: { outputPath: 'images' } } }, //字體圖標(biāo) { test: /\.(eot|svg|ttf|woff|woff2)\w*/, loader: 'file-loader' } ] }, //插件 plugins: [ //清空build文件下的多余文件 new CleanWebpackPlugin(['build']), //將css單獨(dú)打包插件 new ExtractTextPlugin({ filename:"[name].css",//制定編譯后的文件名稱 allChunks:true,//把分割的塊分別打包 }), //html單獨(dú)導(dǎo)出插件——首頁(yè) new HtmlWebpackPlugin({ filename:'lawSearchHomepage.html',//輸出后的文件名稱 template:'./pages/lawSearchHomepage.html',//模版頁(yè)面路徑 favicon:'./pages/images/favicon.ico',//頁(yè)簽圖標(biāo) chunks:['home'],//需要引入的js文件名稱 inject: true, hash:true,//哈希值 minify: {//壓縮 removeComments: true, collapseWhitespace: true } }), //html單獨(dú)導(dǎo)出插件——列表頁(yè) new HtmlWebpackPlugin({ filename:'lawSearchList.html', template:'./pages/lawSearchList.html', favicon:'./pages/images/favicon.ico', chunks:['list'], inject: true, hash:true, minify: { removeComments: true, collapseWhitespace: true } }), //壓縮css new optimizeCss({ assetNameRegExp: /\.style\.css$/g, cssProcessor: cssnano, cssProcessorOptions: { discardComments: { removeAll: true } }, canPrint: true }), //壓縮js new uglifyjs() ], //壓縮優(yōu)化css optimization: { // minimize: true, minimizer: [new optimizeCss({})] }, //出口 output:{ filename: '[name].bundle.js', path: path.resolve(__dirname,'build') } } module.exports = config;
如果在打包過(guò)程中報(bào)模塊沒(méi)有定義錯(cuò)誤,那就再安裝一次,實(shí)在不行,直接刪了node_modules文件,重新npm install一下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Webpack4+Babel7+ES6兼容IE8的實(shí)現(xiàn)
- 詳解用Webpack與Babel配置ES6開(kāi)發(fā)環(huán)境
- Webpack4 使用Babel處理ES6語(yǔ)法的方法示例
- webpack4與babel配合使es6代碼可運(yùn)行于低版本瀏覽器的方法
- 詳解Webpack + ES6 最新環(huán)境搭建與配置
- webpack使用 babel-loader 轉(zhuǎn)換 ES6代碼示例
- es6+angular1.X+webpack 實(shí)現(xiàn)按路由功能打包項(xiàng)目的示例
- 詳解webpack 配合babel 將es6轉(zhuǎn)成es5 超簡(jiǎn)單實(shí)例
- Webpack打包過(guò)程中處理ES6模塊的循環(huán)依賴問(wèn)題小結(jié)
相關(guān)文章
window.open的頁(yè)面如何刷新(父頁(yè)面)上層頁(yè)面
在開(kāi)發(fā)過(guò)程中會(huì)經(jīng)常遇到window.open打開(kāi)的頁(yè)面,同時(shí)問(wèn)題出現(xiàn)了如何刷新上層頁(yè)面呢?本文將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-12uni-app路由配置文件pages.json平臺(tái)化拆分
這篇文章主要為大家介紹了uni-app路由配置文件pages.json平臺(tái)化拆分示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01快速實(shí)現(xiàn)JS圖片懶加載(可視區(qū)域加載)示例代碼
目前很多網(wǎng)站,在圖片加載時(shí)均采用了一種名為懶加載的方式,具體表現(xiàn)為,當(dāng)頁(yè)面被請(qǐng)求時(shí),只加載可視區(qū)域的圖片,其它部分的圖片則不加載,只有這些圖片出現(xiàn)在可視區(qū)域時(shí)才會(huì)動(dòng)態(tài)加載這些圖片,下面本文就介紹了JS圖片懶加載(可視區(qū)域加載)的實(shí)現(xiàn)方法,一起來(lái)看看吧。2017-01-01手把手教你在微信小程序中使用three.js(保姆級(jí)教程)
Three.js是一款運(yùn)行在瀏覽器中的3D引擎,你可以用它創(chuàng)建各種三維場(chǎng)景,包括了攝影機(jī)、光影、材質(zhì)等各種對(duì)象,下面這篇文章主要給大家介紹了關(guān)于如何在微信小程序中使用three.js的保姆級(jí)教程,需要的朋友可以參考下2023-03-03ES6記錄異步函數(shù)的執(zhí)行時(shí)間詳解
在這篇文章里,我會(huì)實(shí)現(xiàn)一個(gè)可重用的函數(shù)來(lái)處理 JavaScript 延時(shí)異步操作。有需要的小伙伴們可以參考借鑒,下面來(lái)一起看看。2016-08-08