1. 程式人生 > >使用webpack包管理工具

使用webpack包管理工具

一 : 最簡單的使用webpack的方法

 

一、全域性安裝 webpack-cli 腳手架

npm install webpack-cli -g

二、新建一個專案wp,並在wp目錄下初始化一個package.json檔案。

npm init -y

 

三、安裝webpack到專案中

將webpack加入到pageage.json配製檔案中,使用以下命令:

$ npm install --save-dev webpack
  • 1

此時再看package.json檔案,對比package.json剛剛建立時,新增加了一段程式碼。 
這裡寫圖片描述

在wp目錄下新建一個src目錄,並在該目錄下新建一個index.js 作為入口檔案 
這裡寫圖片描述

webpack4.x 給我們提供了兩種打包模式:

development 為開發模式 
production 為生產模式,打包出的 main.js 程式碼自動壓縮

我們可以直接使用命令 webpack --mode development 進行開發模式打包 
這裡寫圖片描述 
這裡寫圖片描述
我們使用生產模式webpack --mode production 打包 
這裡寫圖片描述
此時程式碼已經被壓縮。

不管哪種模式,我們每次打包都使用 webpack --mode development 或者 webpack --mode production 都有點麻煩,我們可以修改下package.json檔案裡面的 scripts 屬性:

"dev": "webpack --mode development", 
"build: "webpack --mode production"

最後我們就可以使用 npm run dev 進行開發模式打包,使用 npm run build

 進行生產模式打包。

webpack.config.js

const path = require("path");
module.exports = {
    entry:  ["./src/index.js","./src/index2.js" ], //入口檔案,若不配置webpack4將自動查詢src目錄下的index.js檔案
    output: {
        filename: "[name].js",//輸出檔名,[name]表示入口檔案js名
        path: path.join(__dirname, "dist")//輸出檔案路徑
    }
}

package.json

{
  "name": "testWebpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack --mode development",
    "build": "webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.22.0"
  }
}

二 : webpack打包進階

前言:

webpack4出了以後,一些外掛變化很大,和之前的版本使用方式不一樣,新手入坑,本篇將介紹如何從一開始配置webpack4的開發版本,對css,js進行編譯打包合併生成md5,CSS中的圖片處理,js自動注入html頁,刪除指定檔案,提取公共檔案熱更新等等。

安裝

 
  1. //全域性安裝

  2. npm install -g webpack webpack-cli

建立資料夾初始化

 //建立資料夾

mkdir webpack4demo

//進入

cd webpack4demo

//初始化

npm init -y

建立資料夾scripts 裡面建立index.js檔案

index.js

 const s=()=>{

console.log('s init')

}

s()
  1.  

建立webpack.config.js檔案

webpack.config.js

 const path = require("path");

module.exports = {

entry: {

index: "./scripts/index.js" //入口檔案,若不配置webpack4將自動查詢src目錄下的index.js檔案

},

output: {

filename: "[name].bundle.js",//輸出檔名,[name]表示入口檔案js名

path: path.join(__dirname, "dist")//輸出檔案路徑

}

}
  1.  

執行webpack --mode development將會生成dist/index.bundle.js

建立index.html,並引入js

 <!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>$Title$</title>

</head>

<body>

$END$

</body>

<script src="./dist/index.bundle.js"></script>

</html>
  1.  

開啟瀏覽器將會看到之前設定的js檔案生效

 

對css,js進行編譯打包合併生成md5

建立a.js,c.js,a.css,更改index.js

a.js

 import acss from './a.css'

import c from './c.js'

const a={

init(){

console.log("a init bbbaaa")

},

cinit(){

c.init()

}

}

export default a;
  1.  

c.js

 const c={

init(){

console.log("ccccc")

}

}

export default c;
  1.  

a.css

 body{

background-color: #6b0392;

}
  1.  

index.js

 import a from './a.js'

import c from './c.js'

const s=()=>{

a.init()

a.cinit()

c.init()

console.log('s init')

}

s()
  1.  

配置webpack.config.js檔案

 const path = require("path");

module.exports = {

entry: {

index: "./scripts/index.js"

},

output: {

filename: "[name].bundle.[hash].js",//[hash]會在後面生成隨機hash值

path: path.join(__dirname, "dist")

},

module: { // 處理對應模組

rules: [

{

test: /\.css$/,

use: [ 'style-loader', 'css-loader' ]//處理css

}

]

},

}
  1.  

安裝style-loader, css-loader

npm install style-loader css-loader --save-dev

執行webpack --mode development將會看到一個帶md5值得js檔案,將他引入html中

CSS中的圖片處理

安裝url-loader, file-loader

npm install url-loader file-loader --save-dev

修改a.css 將一張圖片放到scripts目錄

 
  1. body{

  2. background-image: url("./timg.jpg");

  3. background-color: #a748ca;

  4. }

配置webpack.config.js檔案

 
  1. module: {

  2. rules: [

  3. {

  4. test: /\.css$/,

  5. use: [ 'style-loader', 'css-loader' ]

  6. },

  7. {

  8. test:/\.(png|jpg|gif)$/,

  9. use:[{

  10. loader:'url-loader',

  11. options:{

  12. outputPath:'images/',//輸出到images資料夾

  13. limit:500 //是把小於500B的檔案打成Base64的格式,寫入JS

  14. }

  15. }]

  16. }

  17. ]

  18. },

執行webpack --mode development將會看到dist中有一個images資料夾中有一張圖片,開啟index.html

js自動注入html檔案

使用外掛html-webpack-plugin,可以將生成的js自動引入html頁面,不用手動新增

 
  1. //安裝html-webpack-plugin

  2. npm install html-webpack-plugin --save-dev

  3. //安裝webpack webpack-cli

  4. npm install webpack webpack-cli --save-dev

配置webpack.config.js檔案

 
  1. const path = require("path");

  2. const HtmlWebpackPlugin = require('html-webpack-plugin');//引入html-webpack-plugin

  3. module.exports = {

  4. entry: {

  5. index: "./scripts/index.js"

  6. },

  7. output: {

  8. filename: "[name].bundle.[hash].js",

  9. path: path.join(__dirname, "dist")

  10. },

  11. module: {

  12. rules: [

  13. {

  14. test: /\.css$/,

  15. use: [ 'style-loader', 'css-loader' ]

  16. }

  17. ]

  18. },

  19. plugins: [// 對應的外掛

  20. new HtmlWebpackPlugin({ //配置

  21. filename: 'index.html',//輸出檔名

  22. template: './index.html',//以當前目錄下的index.html檔案為模板生成dist/index.html檔案

  23. }),

  24. ]

  25. }

執行webpack --mode development 記得要講之前手動引入的script刪除,便可以看到dist那裡自動生成一個index.html,開啟便可以看到。

刪除指定檔案

使用外掛clean-webpack-plugin,刪除指定檔案,更多配置,檢視clean-webpack-plugin

npm install clean-webpack-plugin --save-dev

配置webpack.config.js檔案

 
  1. const CleanWebpackPlugin = require('clean-webpack-plugin');//引入

  2. plugins: [// 對應的外掛

  3. new HtmlWebpackPlugin({ //配置

  4. filename: 'index.html',//輸出檔名

  5. template: './index.html',//以當前目錄下的index.html檔案為模板生成dist/index.html檔案

  6. }),

  7. new CleanWebpackPlugin(['dist']), //傳入陣列,指定要刪除的目錄

  8. ]

執行webpack --mode development,可以看到dist目錄被刪除,又生成一個新的dist,之前的js檔案已經被刪除。

提取公共檔案

我們可看到a.js和index.js都引入了c.js檔案,為什麼要提取公共程式碼,簡單來說,就是減少程式碼冗餘,提高載入速度。和之前的webpack配置不一樣:

 
  1. //之前配置

  2. // new webpack.optimize.SplitChunksPlugin({

  3. // name: 'common', // 如果還要提取公共程式碼,在新建一個例項

  4. // minChunks: 2, //重複兩次之後就提取出來

  5. // chunks: ['index', 'a'] // 指定提取範圍

  6. // }),

  7. //現在配置

  8. optimization: {

  9. splitChunks: {

  10. cacheGroups: {

  11. commons: { // 抽離自己寫的公共程式碼

  12. chunks: "initial",

  13. name: "common", // 打包後的檔名,任意命名

  14. minChunks: 2,//最小引用2次

  15. minSize: 0 // 只要超出0位元組就生成一個新包

  16. },

  17. vendor: { // 抽離第三方外掛

  18. test: /node_modules/, // 指定是node_modules下的第三方包

  19. chunks: 'initial',

  20. name: 'vendor', // 打包後的檔名,任意命名

  21. // 設定優先順序,防止和自定義的公共程式碼提取時被覆蓋,不進行打包

  22. priority: 10

  23. },

  24. }

  25. }

  26. },

下載jq npm install jquery --save 在a.js,index.js引用 import $ from 'jquery' 輸出$

生成3個js檔案,執行webpack --mode development

熱更新,自動重新整理

我們將用到webpack-dev-servewebpack-dev-server就是一個基於Node.jswebpack的一個小型伺服器,它有強大的自動重新整理熱替換功能。

安裝webpack-dev-serve

npm install webpack-dev-serve --save-dev

配置webpack.config.js檔案

 
  1. const webpack = require("webpack");

  2. plugins: [

  3. new HtmlWebpackPlugin({

  4. filename: 'index.html',

  5. template: './index.html',

  6. }),

  7. new CleanWebpackPlugin(['dist']), //傳入陣列,指定要刪除的目錄

  8. // 熱更新,熱更新不是重新整理

  9. new webpack.HotModuleReplacementPlugin()

  10. ],

  11. devServer: {//配置此靜態檔案伺服器,可以用來預覽打包後項目

  12. inline:true,//打包後加入一個websocket客戶端

  13. hot:true,//熱載入

  14. contentBase: path.resolve(__dirname, 'dist'),//開發服務執行時的檔案根目錄

  15. host: 'localhost',//主機地址

  16. port: 9090,//埠號

  17. compress: true//開發伺服器是否啟動gzip等壓縮

  18. },

配置package.json

 
  1. "scripts": {

  2. "dev": "webpack-dev-server --mode development"

  3. },

執行npm run dev 訪問 http://localhost:9090/

隨便修改任一檔案便會自動重新整理網站顯示修改相應內容。

總結:

webpack4還有很多很多配置,例如css的拆分呀,less sass配置呀,js編譯es6呀,多入口配置呀,生產環境配置,js沒有使用的模組自動檢測剝離等等,只能等下次有空在總結,感謝大家的觀看,新手入坑,歡迎指出錯誤的地方。