模塊打包機:分析你的項目結構,找到其中的javaScript模塊以及一些其餘不能直接被瀏覽器運行的拓展語言(Scss、TypeScipt)並將其轉換和打包爲適合瀏覽器運行的格式。css
webpack4以後webpack-cli被抽離出來了,須要單獨安裝。若是沒有安裝運行的時候會提示
One CLI for webpack must be installed.
html
$ npm install -g webpack $ npm install -g webpack-cli
建立npm配置文件package.jsonjava
$ npm init -y
$ npm install webpack --save-dev
├── app │ ├── mian.js │ └── Greeter.js └── public ├── index.html └── bundle.js(webpack打包後生成)
index.html:node
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title></title> </head> <body> //bundle.js爲webpack打包後生成的文件 <script src="bundle.js"></script> </body> </html>
Greeter
(根據CommonJS規範命名一個模塊)Greeter.js:webpack
module.exports = function() { var greet = document.createElement('div'); greet.textContent = "Hello World!"; return greet; };
在main.js
加載模塊web
main.js:正則表達式
const greeter = require('./Greeter.js'); document.body.appendChild(greeter());
// webpack {{入口文件路徑}} -o {{打包後文件存放路徑}} $ webpack app/main.js -o public/bundle.js --mode development
打開index.html
npm
webpack除了上述的打包功能還有不少高級的功能,若是僅僅經過命令行的形式,不但不方便並且容易出錯。json
webpack.config.js
"__dirname"是node.js中的一個全局變量,它指向腳本執行的當前路徑。瀏覽器
webpack.config.js:
module.exports = { // 入口文件路徑 entry: __dirname + "/app/main.js", // 打包後的輸出 output: { // 輸出路徑 path: __dirname + "/public", // 輸出文件名 filename: "bundle.js" } }
package.json
中添加mode配置
development
:開發者模式側重功能調試production
:發佈模式側重模塊體積優化及線上部署
"scripts": { "dev": "webpack --mode development", "build": "webpack --mode production" }
$ npm install webpack-dev-server --save-dev
webpack.config.js
添加配置
webpack-dev-server
實時編譯後的文件都保存到了內存當中,因此在目錄中看不到編譯後的文件
module.exports = { devServer: { // 本地服務器加載頁面所在的路徑 contentBase: __dirname + "/public", historyApiFallback: true, // 實時刷新 inline: true } }
咱們修改Greeter.js
之後會自動編譯,而後刷新頁面。
server只會實時編譯js文件,html、css文件並不自動刷新因此咱們須要安裝相應的插件
html
$ npm install html-webpack-plugin --save-dev
在webpack.config.js
文件添加配置
const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { entry: __dirname + "/app/main.js", output:{ path: __dirname + "/public", filename: "bundle.js" }, devServer:{ contentBase: __dirname + "/public" }, plugins: [new HtmlWebpackPlugin({ template: __dirname + "/public/index.html", filename: 'index.html', inject: 'body' })] }
css
$ npm install style-loader css-loader --save-dev
在webpack.config.js
文件添加配置
module: { rules: [ { test: /\.css$/, use: [ { loader: "style-loader" }, { loader: "css-loader" } ] } ] }
咱們在public文件夾下建立index.css文件
body{ color:#0000ff; }
在main.js導入
import '../public/index.css'; const greeter = require('./Greeter.js'); document.body.appendChild(greeter());
如今咱們修改css及html文件都會獲得動態的刷新
Loaders是webpack提供的最激動人心的功能之一了。經過使用不一樣的loader,webpack有能力調用外部的腳本或工具 如
scss -> css
ES6 -> ES5
JSX -> JS
咱們在上面就用到了style-loader
,css-loader
來動態刷新css
test : 匹配loaders處理文件的擴展名的正則表達式
include : 手動添加須要處理的文件
exclude : 須要屏蔽不進行處理的文件
loader : loaders名稱 use的快捷配置方式
use : 所使用的loaders列表
Loaders的使用大體和上面style-loader css-loader
相似,再拿label爲例
Babel是一個JavaScript的編譯平臺,它能夠編譯如今瀏覽器沒有徹底支持的ES6及基於JavaScipt的擴展語言(React的JSX等)
安裝
$ npm install babel-loader babel-core babel-preset-es2015 --save-dev
webpack.config.js
文件添加配置module: { rules: [{ test: /\.js$/, use: { loader: "babel-loader" }, exclude: /node_modules/ }] }
Plugins是用來拓展Webpack功能的,它們會在整個構建過程當中生效,執行相關的任務。而loaders是在項目打包構建的過程當中用來處理源文件。
咱們須要經過npm根據需求來安裝咱們須要的插件
$ npm install plugins-name --save-dev
Plugins必須在webpack.config.js
配置,並向plugins屬性中傳入new的實例。
咱們在上面使用html-webpack-plugin
,你會發現咱們使用require方法引入了咱們須要的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
而後在plugins屬性中new了一個實例
new HtmlWebpackPlugin({ template: __dirname + "/public/index.html", filename: 'index.html', inject: 'body' })
而且傳入了配置參數,而後插件就會在整個構建過程當中生效,執行任務。