npm i webpack -g
全局安裝webpack,這樣就能在全局使用webpack的命令npm i webpack --save-dev
安裝到項目依賴中項目結構:javascript
npm init -y
初始化項目,使用npm管理項目中的依賴包npm i jquery -s
安裝jquery類庫main.js
並書寫隔行變色的代碼邏輯:// 導入jquery類庫 import $ from 'jquery' $(function () { // 設置奇數行背景色 $('li:odd').css('background-color','lightblue') // 設置偶數行背景色,索引從0開始,0是偶數 $('li:even').css('background-color',function () { return '#'+'F15A24' }) })
main.js
會報錯,由於瀏覽器不認識import
這種高級的JS語法,須要使用webpack進行處理,webpack默認會把這種高級的語法轉換爲低級的瀏覽器能識別的語法;webpack 入口文件路徑 輸出文件路徑
對main.js
進行處理:webpack src/js/main.js -o dist/bundle.js
注意若是提示沒有webpack-cli,安裝:css
npm install webpack-cli -g
index.html:html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>Title</title> <style> </style> <!--注意不推薦在這裏引入任何包和css文件--> <!--因爲es6語法瀏覽器不識別 會報錯--> <script src="../dist/bundle.js"></script> </head> <body> <ul> <li>這是第1個li</li> <li>這是第2個li</li> <li>這是第3個li</li> <li>這是第4個li</li> <li>這是第5個li</li> <li>這是第6個li</li> <li>這是第7個li</li> <li>這是第8個li</li> <li>這是第9個li</li> <li>這是第10個li</li> </ul> </body> </html>
項目結構:java
webpack.config.js
webpack.config.js
中配置這兩個路徑:webpack
// 導入處理路徑的模塊 var path = require('path'); // 導出一個配置對象,未來webpack在啓動的時候,會默認來查找webpack.config.js,並讀取這個文件中導出的配置對象,來進行打包處理 module.exports = { entry: path.resolve(__dirname, 'src/js/main.js'), // 項目入口文件 output: { // 配置輸出選項 path: path.resolve(__dirname, 'dist'), // 配置輸出的路徑 filename: 'bundle.js' // 配置輸出的文件名 } }
webpack-dev-server
來實現代碼實時打包編譯,當修改代碼以後,會自動進行打包構建。cnpm i webpack-dev-server --save-dev
安裝到開發依賴或者 npm i wepack-dev-server -D
webpack-dev-server
來進行打包,發現報錯,此時須要藉助於package.json
文件中的指令,來進行運行webpack-dev-server
命令,在scripts
節點下新增"dev": "webpack-dev-server"
指令,發現能夠進行實時打包,可是dist目錄下並無生成bundle.js
文件,這是由於webpack-dev-server
將打包好的文件放在了內存中bundle.js
放在內存中的好處是:因爲須要實時打包編譯,因此放在內存中速度會很是快http://localhost:8080/
網站,發現是一個文件夾的面板,須要點擊到src目錄下,才能打開咱們的index首頁,此時引用不到bundle.js文件,須要修改index.html中script的src屬性爲:<script src="../bundle.js"></script>
http://localhost:8080/
的時候直接訪問到index首頁,可使用--contentBase src
指令來修改dev指令,指定啓動的根目錄:"dev": "webpack-dev-server --contentBase src"
同時修改index頁面中script的src屬性爲<script src="bundle.js"></script>
node
這時的index.html:jquery
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>Title</title> <style> </style> <!--注意不推薦在這裏引入任何包和css文件--> <!--因爲es6語法瀏覽器不識別 會報錯--> <!--<script src="../dist/bundle.js"></script>--> <!-- /bundle.js放在了內存中,實際看不到 是在根目錄下--> <script src="/bundle.js"></script> </head> <body> <ul> <li>這是第1個li</li> <li>這是第2個li</li> <li>這是第3個li</li> <li>這是第4個li</li> <li>這是第5個li</li> <li>這是第6個li</li> <li>這是第7個li</li> <li>這是第8個li</li> <li>這是第9個li</li> <li>這是第10個li</li> </ul> </body> </html>
經常使用命令:webpack
"dev": "webpack-dev-server --open --port 3000 --contentBase src --hot" --open表示自動打開 --port 3000 端口3000 --contentBase src根路徑 --hot 熱啓動 不須要手動刷新頁面 自動重載
package.json:es6
{ "name": "WEBPACK-STUDY", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack-dev-server --open --port 3000 --contentBase src --hot" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "jquery": "^3.3.1", "webpack": "^4.25.1" }, "devDependencies": { "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.10" } }
第二種配置方法:web
更改dev: "dev": "webpack-dev-server " 修改webpack.config.js,以下: const path = require('path'); // 啓用熱更新的 第2步 const webpack = require('webpack') //導入插件 // 這個配置文件,起始就是一個 JS 文件,經過 Node 中的模塊操做,向外暴露了一個 配置對象 module.exports = { entry: path.join(__dirname, './src/main.js'),// 入口,表示,要使用 webpack 打包哪一個文件 output: { // 輸出文件相關的配置 path: path.join(__dirname, './dist'), // 指定 打包好的文件,輸出到哪一個目錄中去 filename: 'bundle.js' // 這是指定 輸出的文件的名稱 }, //配置dev-server第二種形式 devServer: { open: true,//自動打開瀏覽器 port:3000,//啓動時候的端口 contentBase:'src',//指定託管的根目錄 hot:true //啓用熱更新 }, plugins:[ //第三步 new webpack.HotModuleReplacementPlugin() //new一個熱更新的模塊 ] }
html-webpack-plugin
插件配置啓動頁面因爲使用--contentBase
指令的過程比較繁瑣,須要指定啓動的目錄,同時還須要修改index.html中script標籤的src屬性,因此推薦你們使用html-webpack-plugin
插件配置啓動頁面.npm
cnpm i html-webpack-plugin --save-dev
安裝到開發依賴npm i html-webpack-plugin -D
webpack.config.js
配置文件以下:// 導入處理路徑的模塊 var path = require('path'); // 導入在內存中生成 HTML 頁面的 插件 // 只要是插件,都必定要 放到 plugins 節點中去 // 這個插件的兩個做用: // 1. 自動在內存中根據指定頁面生成一個內存的頁面 // 2. 自動,把打包好的 bundle.js 追加到頁面中去 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: path.resolve(__dirname, 'src/js/main.js'), // 項目入口文件 output: { // 配置輸出選項 path: path.resolve(__dirname, 'dist'), // 配置輸出的路徑 filename: 'bundle.js' // 配置輸出的文件名 }, plugins:[ // 添加plugins節點配置插件 new htmlWebpackPlugin({ template:path.resolve(__dirname, 'src/index.html'),//模板路徑 filename:'index.html'//自動生成的HTML文件的名稱 }) ] }
package.json
中script
節點中的dev指令以下:"dev": "webpack-dev-server"
html-webpack-plugin
插件會自動把bundle.js注入到index.html頁面中!注意:熱更新在JS中表現的不明顯,能夠從一下子要講到的CSS身上進行介紹說明!
package.json
的script節點以下,其中--open
表示自動打開瀏覽器,--port 4321
表示打開的端口號爲4321,--hot
表示啓用瀏覽器熱更新:"dev": "webpack-dev-server --hot --port 4321 --open"
webpack.config.js
文件,新增devServer
節點以下:devServer:{ hot:true, open:true, port:4321 }
webpack
模塊:var webpack = require('webpack');
plugins
節點下新增:new webpack.HotModuleReplacementPlugin()
運行cnpm i style-loader css-loader --save-dev
main.js引入:
//import *** from *** 是es6中導入模塊的方式 import $ from 'jquery' //webpack只能打包處理js類型文件,沒法處理非js類型的文件 //若是要處理非js的文件 須要手動安裝第三方的加載器 //須要安裝style-loader css-loader import './css/index.css' $(function () { $('li:odd').css('background-color','yellow'); $('li:even').css('background-color',function () { return '#'+'F15A24' }) })
修改webpack.config.js
這個配置文件:
const path = require('path'); // 啓用熱更新的 第2步 const webpack = require('webpack') //導入html插件 //只要是插件,都必定要放到plugins節點中去 const htmlWebpackPlugin = require('html-webpack-plugin') // 這個配置文件,起始就是一個 JS 文件,經過 Node 中的模塊操做,向外暴露了一個 配置對象 module.exports = { entry: path.join(__dirname, './src/main.js'),// 入口,表示,要使用 webpack 打包哪一個文件 output: { // 輸出文件相關的配置 path: path.join(__dirname, './dist'), // 指定 打包好的文件,輸出到哪一個目錄中去 filename: 'bundle.js' // 這是指定 輸出的文件的名稱 }, //配置dev-server第二種形式 devServer: { open: true,//自動打開瀏覽器 port:3000,//啓動時候的端口 contentBase:'src',//指定託管的根目錄 hot:true //啓用熱更新 }, plugins:[ //第三步 new webpack.HotModuleReplacementPlugin(), //new一個熱更新的模塊 new htmlWebpackPlugin({//建立一個在內存中生成html頁面插件 template:path.join(__dirname,'./src/index.html'), filename:'index.html' //指定生成頁面的名稱 }) ], module:{//這個是第三方的加載器 rules:[//正則的文件匹配規則 {test:/\.css$/,use:['style-loader','css-loader']} ] } }
module: { // 用來配置第三方loader模塊的 rules: [ // 文件的匹配規則 { test: /\.css$/, use: ['style-loader', 'css-loader'] }//處理css文件的規則 ] }
use
表示使用哪些模塊來處理test
所匹配到的文件;use
中相關loader模塊的調用順序是從後向前調用的;cnpm i less-loader less -D
webpack.config.js
這個配置文件:{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
cnpm i sass-loader node-sass --save-dev
webpack.config.js
中添加處理sass文件的loader模塊:{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
cnpm i url-loader file-loader --save-dev
webpack.config.js
中添加處理url路徑的loader模塊:{ test: /\.(png|jpg|gif)$/, use: 'url-loader' }
limit
指定進行base64編碼的圖片大小;只有小於指定字節(byte)的圖片纔會進行base64編碼:{ test: /\.(png|jpg|gif)$/, use: 'url-loader?limit=43960' },
cnpm i babel-core babel-loader babel-plugin-transform-runtime --save-dev
安裝babel的相關loader包cnpm i babel-preset-es2015 babel-preset-stage-0 --save-dev
安裝babel轉換的語法webpack.config.js
中添加相關loader模塊,其中須要注意的是,必定要把node_modules
文件夾添加到排除項:{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
.babelrc
文件,並修改這個配置文件以下:{ "presets":["es2015", "stage-0"], "plugins":["transform-runtime"] }
babel-preset-es2015
能夠更新爲babel-preset-env
,它包含了全部的ES相關的語法;