1. 程式人生 > >webpack4學習(React)--重點細節整理筆記(Webpack 4 教程:從零配置到生產釋出--http://www.css88.com)

webpack4學習(React)--重點細節整理筆記(Webpack 4 教程:從零配置到生產釋出--http://www.css88.com)

一、開始配置webpack4開發環境  

  1. cmd開啟操作介面
  2. mkdir 檔名 && cd 檔名   ------建立專案並進入專案目錄
  3. npm init -y   ------初始化建立package.json檔案,-y的意思是初始化時全部選擇yes,不需要每一步都確認
  4. 因為webpack的cli在webpack4版本之前是和webpack在一起的,而webpack4將其分開,為了更好的管理,所以必須同時引入webpack4與webpack-cli ,使用命令npm i webpack webpack-cli --save-dev(i是install的縮寫,--save-dev表示非全域性安裝,僅在此專案下安裝)
  5. 配置package.json檔案新增“script”{“build”:"webpack"}
  6. 此時執行npm run build,會報錯,在webpack4之前的版本,需要在webpack.config.js配置entry入口檔案,而現在預設的入口檔案是./src/index.js,只需在專案中建立src資料夾,並新建index.js檔案,即可正常執行npm run build
  7. webpack的輸出檔案也不需要定義,預設的輸出目錄是./dist/main.js,執行後會預設將檔案打包至dist目錄中,此檔案不需要自建 

二、webpack4的兩種開發環境development(開發)、production(生產)

  1. 在webpack4之前,開發環境和生產環境需要兩個不同的檔案來控制
  2. 在webpack4中只需要在package.json執行時設定相應的執行模式即可:設定“script”{“build”:“webpack --mode development”,“dev”:“webpack --mode production”},此時如果執行npm run build 打包成的檔案是經過壓縮的,而npm run dev打包而成的檔案是未壓縮的
  3. 兩種模式的效果:開發模式執行速度提升了,生產環境進行了壓縮和作用域提升等

三、覆蓋對應的入口檔案及出口檔案

  • 只需在package.json中配置對應的檔案位置

例:我的專案檔名字為testwebpack

 “script”:{

       "build":"webpack --mode production .testwebpack/src/index2.js --output .dist/main2.js "

       "dev":"webpack --mode development .testwebpack/src/index2.js --output .dist/main2.js "

}

四、使用Babel將ES6轉換為ES5

4.1 安裝babel相關的載入項

命令:npm i babel-core babel-loader babel-preset-env --seve-dev

1、babel-core(babel編譯器的核心,如果想使用babel-loader進行編譯,必須安裝babel-core,安裝完不需要引用)

2、babel-loader(webpack中需要引用的loader)

3、babel-preset-env(用於將ES6程式碼編譯為ES5程式碼,此方式推薦使用)

babel-preset-env的優勢在於按需編譯:例如使用babel-preset-es2015的時候會將大部分瀏覽器都支援的generator函式也編譯,這是沒有必要的,而babel-preset-env可以宣告環境,只會編譯環境中不支援的特性。

4、建立babel的配置檔案.babelrc,

檔案內容:

{

"presets":["env"]

}

4.2 babel-loader的兩種使用方法

1、通過配置檔案新增(webpack4零配置的口號當前僅限於①入口檔案、②出口檔案、③執行環境三者不需要配置,其他loader仍然需要配置,如果想改變入口檔案和出口檔案,才需要在配置檔案中寫entry屬性與output屬性),新增配置檔案webpack.config.js,內容如下:

module.exports = {

    module: {

        rules: [ {

                   test: /\.js$/,//匹配的副檔名

                   exclude: /node_modules/,  //排除不需要編譯的檔案,加快編譯速度

                  use: {

                           loader: "babel-loader"

                   }

         }]

}

};

2、不通過配置檔案用babel-loader檔案,在webpack.json中配置,--module-bind 引數在命令列指定載入器(不建議使用,最好不增加scripts的複雜性),如下:

"scripts": {

"dev": "webpack --mode development --module-bind js=babel-loader",

"build": "webpack --mode production --module-bind js=babel-loader"

}

五、在React中使用webpack4

1、安裝React

     npm i react react-dom --save-dev(react 是react的核心程式碼,react的核心是虛擬DOM,即使用js物件來表達一個DOM的包含;react-dom的核心功能就是將這些虛擬的DOM編譯成為實際的DOM)

2、安裝babel-preset-react

     npm i babel-preset-react --save-dev(babel-preset-react: 轉義react的jsx語法)

3、設定.babelrc

{"presets": ["env", "react"]}

4、配置webpack.config.js載入loader

module.exports = {

module: {

rules: [{

test: /\.(js|jsx)$/,

exclude: /node_modules/,

use: {

loader: "babel-loader"

}

}

]

}

};

5、運用es6語法編寫js檔案或者jsx檔案,接下來在 ./src/index.js 中 import(匯入) 元件(import App from "./App";)

6、最後執行npm run build

7、此時看不到介面效果,我們需要引入其他元件來編譯頁面html-webpack-plugin 和 html-loader;安裝html-webpack-plugin(打包時自動生成html檔案,幷包含css、js檔案的引用)、html-loader(html-loader 將解析 URL,並請求圖片和你所期望的一切資源)

命令:npm i html-webpack-plugin html-loader --save-dev

配置webpack.config.js:

const HtmlWebPackPlugin = require("html-webpack-plugin");
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader",
            options: { minimize: true }
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    })
  ]
};

8、在 ./src/index.html中新建html檔案

程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>webpack 4 quickstart</title>
</head>
<body>
    <div id="app">
    </div>
</body>
</html>

9、執行npm run build(此時頁面已經有顯示)

10、配置載入css:mini-css-extract-plugin(webpack4.2.0以上才可用,將css提取到檔案中)

npm i mini-css-extract-plugin css-loader --save-dev

在index.js中匯入css檔案,然後配置webpack.config.js

配置如下:

const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader",
            options: { minimize: true }
          }
        ]
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    }),
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    })
  ]
};

11、配置webpack dev server(每次更改,自動更新介面,開發時使用非常方便)

安裝命令:npm i webpack-dev-server --save-dev

配置package.js

"scripts": {

"start": "webpack-dev-server --mode development --open",

"build": "webpack --mode production"

}

執行npm run start,修改檔案即可動態更新介面效果

有些程式碼是從別處引用,自己整理文件,主要用於自己參考學習-.-

附:

babel常見外掛作用

* babel: ES6轉義的核心包
* babel-cli: 用於在終端使用babel,用命令列轉碼
* babel-core: 如果某些程式碼需要呼叫Babel的API進行轉碼,就要使用`babel-core`模組
* babel-loader: 執行轉義的核心包
* babel-plugin-react-transform: 代替react-hot-loader的外掛
* babel-preset-es2015: 現在被babel-preset-env取代了,被babel未來不會過時的(future-proof)”解決方案
* babel-preset-react: 轉義react的jsx語法,
* babel-preset-stage-0: ”stage-0"是對ES7一些提案的支援,Babel通過外掛的方式引入,包含stage-1, stage-2以及stage-3的所有功能

完!