Webpack概念

webpack概念

我常常用 webpack,打算作一次比较详细的概念清点和梳理。从 0 配置 webpack,因为 webpack5(2019.07.27)暂时尚未发布。而且从Webpack Milestones上来看,截止到 7 月 27 日,完成度是 64%。有喜欢钻研的同窗能够去研究一下 5,个人重点仍是当前 4.X。javascript

Hello World

因为是概念清点,先从最基础的开始。css

mkdir webpack-test
cd webpack-test
npm init -y
npm i --save-dev webpack

接下来,新建一个src目录,建立index.js,而后在package.jsonscripts下加入java

"scripts": {
    "webpack": "webpack"
}

接着在当前目录启动终端,输入node

npm run webpack

这个时候就能看到webpacksrc入口的index.js打包到dist目录下的main.jswebpack

因为parcle宣传约定先于配置的火爆,webpack在 4.X 中也加入了默认配置,即若是没有webpack.config.js或者没有配置入口entry,则默认为src/index.js。同理,默认的输出outputs 是dist/main.jsgit

核心概念

webpack有五个概念须要了解。github

entry

entry用来告诉webpack应该从哪一个 JS 文件开始去寻找相关依赖,而且把它们打包成一个或者多个 bundle,最终输出到指定目录。默认值为./src/index.js,能够有多个 entry。经常使用的配置以下:web

// 单文件
module.exports = {
  entry: "./src/file1.js"
};
// 单文件数组,不经常使用,默认打到一个文件中
module.exports = {
  entry: ["./src/file1.js", "./src/file2.js"]
};
// 将输出
// dist
// └── main.js
// 多文件对象,经常使用,会分entry入口打包,输出文件名为entry配置的key
module.exports = {
  entry: {
    file1: "./src/file1.js",
    file22: "./src/file2.js"
  }
};
// 将输出
// dist
// ├── file1.js
// └── file22.js

output

output就是用来指定把 bundle 输出到哪里的配置,默认值为./dist
output有两个配置项:npm

  1. filename
    filename 用于配置输出文件的文件名
  2. path
    输出文件的绝对路径
// 默认配置
const path = require("path");
module.exports = {
  output: {
    filename: "main.js",
    path: path.join(__dirname, "dist")
  }
};

若是有多个入口,则可使用占位符来指定文件名,或者添加 hash 等。json

module.exports = {
  output: {
    filename: "[name].[hash:16].js",
    path: path.join(__dirname, "dist")
  }
};

loader

loader主要用来预处理各类文件。好比咱们经常使用的babel-loadercss-loader
在使用以前,须要先安装

npm install --save-dev css-loader style-loader
npm install --save-dev babel-loader @babel/core @babel/preset-env

为文件加入loader配置

module.exports = {
  module: {
    rules: [
      { test: /\.css$/, use: ["style-loader", "css-loader"] },
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"]
          }
        }
      }
    ]
  }
};

plugin

插件机制给webpack提供了更多自定义的能力。webpackplugin具备apply方法,而且会在webpack编译时调用,经过在plugin对象中对webpack提供的各类hook作操做,达到咱们修改bundle的目的。

官网的一个例子:

const pluginName = "ConsoleLogOnBuildWebpackPlugin";

class ConsoleLogOnBuildWebpackPlugin {
  apply(compiler) {
    compiler.hooks.run.tap(pluginName, compilation => {
      console.log("webpack 构建过程开始!");
    });
  }
}

mode

mode比较简单,一般来讲,有两种内置modedevelopmentproduction,能够经过webpack.config.js配置,或者经过CLI参数传递。

module.exports = {
  mode: "production"
};
webpack --mode=production

设置了mode以后,nodejs进程中的process.env.NODE_ENV也会被同步设置。
webpack对于mode有一些本身的区分,在production模式下,会打开代码压缩、去除一些热更新的代码等,在生产环境中切记要将mode设置为production

相关文章
相关标签/搜索