1. 程式人生 > 其它 >webpack 的安裝以及 babel 的配置

webpack 的安裝以及 babel 的配置

webpack 安裝

  • npm 初始化,控制檯輸入
npm init -y
  • webpack 安裝
npm i webpack webpack-cli -D

新建 webpack.config.js

const path = require('path')
module.exports = {
     mode: "development",
    entry:'./src/index.js',
    output:{
        filename:'bundle.js',
        path:path.resolve(__dirname,"dist")
    }
}

mode: 模式(可選:development,production)
entry: 入口檔案
output: 打包輸出檔案(既打包到哪裡)

在根目錄新建 src/index.js

module.exports=function(){
    return 2
}

package.json 配置啟動

因為 webpack 不是全域性安裝的,所以不能使用 webpack 命令進行打包。可以在 package.json 中配置"build":"webpack":

{
  "name": "webpackBabel",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build":"webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^5.59.1",
    "webpack-cli": "^4.9.1"
  }
}
 

到這裡簡單的 webpack 已經配置完成,在終端輸入

npm run build

此時你就會發現多了個 dist/bundle.js 檔案

/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/    var __webpack_modules__ = ({
 

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/***/ ((module) => {
 

eval("module.exports=function(){\r\n    return 2\r\n}\n\n//# sourceURL=webpack://webpackBabel/./src/index.js?");
 

/***/ })
 

/******/    });
/************************************************************************/
/******/    // The module cache
/******/    var __webpack_module_cache__ = {};
/******/
/******/    // The require function
/******/    function __webpack_require__(moduleId) {
/******/        // Check if module is in cache
/******/        var cachedModule = __webpack_module_cache__[moduleId];
/******/        if (cachedModule !== undefined) {
/******/            return cachedModule.exports;
/******/        }
/******/        // Create a new module (and put it into the cache)
/******/        var module = __webpack_module_cache__[moduleId] = {
/******/            // no module.id needed
/******/            // no module.loaded needed
/******/            exports: {}
/******/        };
/******/
/******/        // Execute the module function
/******/        __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/        // Return the exports of the module
/******/        return module.exports;
/******/    }
/******/
/************************************************************************/
/******/
/******/    // startup
/******/    // Load entry module and return exports
/******/    // This entry module is referenced by other modules so it can't be inlined
/******/    var __webpack_exports__ = __webpack_require__("./src/index.js");
/******/
/******/ })()
;

這就是打包後的檔案,webpack 預設自帶 common.js 解析,可以直接打包

loader 配置

webpack 如果需要打包 css,img 等檔案時候是需要藉助 loader 配置,在 module 引數進行配置,以下用了幾個常用 loader 配置:

const path = require('path')
module.exports = {
    mode: "development",
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, "dist")
    },
    module: {
        rules: [{
            test: /\.css$/,
            use: [
                // [style-loader](/loaders/style-loader)
                { loader: 'style-loader' },
                // [css-loader](/loaders/css-loader)
                {
                    loader: 'css-loader',
                    options: {
                        modules: true
                    }
                }
            ]
        }, {
            test: /\.(jpg|png|gif)$/,
            use: {
                loader: 'url-loader',
                options: {
                    name: '[name]_[hash].[ext]',
                    outputPath: 'images/',
                    limit: 10240 //如果圖片大小小於10240則採用base64
                }
            }
        }, {
            test: /\.(eot|ttf|svg)$/,
            use: {
                loader: 'file-loader'
            }
        }]
    }
}

loader 是需要進行安裝的:

npm i url-loader file-loader url-loader css-loader style-loader -D

HtmlWebpackPlugin 外掛的安裝

安裝 html-webpack-plugin

npm i html-webpack-plugin -D

html-webpack-plugin 外掛可以在 dist 資料夾下生產一個 index.html 檔案並且引入打包後的 js 檔案

html-webpack-plugin 配置在 plugin 中:

...
const HtmlWebpackPlugin = require("html-webpack-plugin")
...
plugins: [
        new HtmlWebpackPlugin()
    ]

執行 npm run build 後會發現 dist 檔案下多了個 index.html 並且引入了 bundle.js

babel 的配置

  • 安裝 babel
npm install --save-dev babel-loader @babel/preset-env @babel/core

配置 babel-loader:

module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,//不轉換的檔案
                use: [{
                    loader: 'babel-loader'
                }]
            },
            {
            test: /\.css$/,
            use: [
                // [style-loader](/loaders/style-loader)
                { loader: 'style-loader' },
                // [css-loader](/loaders/css-loader)
                {
                    loader: 'css-loader',
                    options: {
                        modules: true
                    }
                }
            ]
        }
        ...
        ]
    }
    ...
  • 新建.babelrc 檔案
{
  "presets": ["@babel/preset-env"]
}
 

src/index.js 寫一個 es6 語法:

module.exports=function(){
    const a = 1
    return a
}

然後執行 npm run build ,就會發現 dist/bundle.js 裡的 const 被轉換成了 var,雖然有些語法可以進行轉換,但是遇到如 promise 打包過後 promise 並不會被轉換,所以此時就需要墊片(polyfill)

@babel/polyfill 的使用

處理類似 assign,includes,map,includes,promise 的墊片

  • 安裝
npm i @babel/polyfill -s
  • babelrc 配置
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "debug": true,
        "useBuiltIns": "usage"//usage表示按需引入polyfill,entry全部引入,false不引入
      }
    ]
  ]
}
 

到這babel基本可以實現到es5的轉換了。

runtime為開發元件而生

polyfill 問題是已經解決了,但是如果你是開發 一個 npm 元件,此時就不能用polyfill了,因為polyfill會汙染全域性變數,這時候就要用到一個外掛@babel/plugin-transform-runtime

  • 安裝
npm install --save @babel/runtime
npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime-corejs2 --save
  • .babelrc
{
    "presets": [
        [
            "@babel/preset-env",
            {
                "debug": true,
                "useBuiltIns": "false"
            }
        ]
    ],
    "plugins": [
        [
            "@babel/plugin-transform-runtime",
            {
                "corejs": 2 // 參考官方文件
              }
        ]
    ],
}