webpack概念

我经常用 webpack,打算做一次比较详细的概念清点和梳理。从 0 配置 webpack,由于 webpack5(2019.07.27)暂时还没有发布。并且从Webpack Milestones上来看,截止到 7 月 27 日,完成度是 64%。有喜欢钻研的同学可以去研究一下 5,我的重点还是当前 4.X。

Hello World

由于是概念清点,先从最基础的开始。

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

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

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

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

npm run webpack

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

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

核心概念

webpack有五个概念需要了解。

entry

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

// 单文件
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有两个配置项:

  1. filename

    filename 用于配置输出文件的文件名
  2. path

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

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

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

Webpack概念的更多相关文章

  1. Webpack 概念

    概念 webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图表(dependency ...

  2. [WIP]webpack 概念

    创建: 2019/04/09 概念    入口 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始. 进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖 ...

  3. webpack——概念的引入

    ## 在网页中会引用哪些常见的静态资源?+ JS - .js .jsx .coffee .ts(TypeScript 类 C# 语言)+ CSS - .css .less .sass .scss+ I ...

  4. 1.WebPack概念

    一.什么是WebPack 官方解释:本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构 ...

  5. Webpack 入门指迷--转载(题叶)

    最近看到这个东西,一头雾水.看了一些资料了解了Webpack概念,大体是webpack 是一个模块绑定器,主要目的是在浏览器上绑定 JavaScript 文件. 看到题叶写的一篇介绍,写的很好,转载连 ...

  6. webpack3中文版使用参考文档--全面解析webpack.config.js

    Webpack目前官方发布的最新版本是3.1.0,相对于2.0的怎么本,在语法上没有变动,只是新增了功能.使用webpack,需要事先安装node.js,并对node.js生态有一些基本的了解,比如( ...

  7. 理解 Gulp 和 Webpack(转)

    Gulp 和 webpack 之间的关系是十分暧昧的,却也经常被人误解,以为它俩是竞争关系,其实不然. Gulp 是一个任务管理工具,让简单的任务更清晰,让复杂的任务易于掌控:而 webpack 的理 ...

  8. Webpack 打包工具

    1. webpack 概念 [文档地址](https://www.webpackjs.com/concepts/) 2. webpack 命令使用及相关工具包 1. webpack 安装和打包命令: ...

  9. 转:Cesium 和 Webpack

    原文地址:https://www.jianshu.com/p/85917bcc023f 注意:webpack 和 webpack-cli 的安装参考 https://www.cnblogs.com/m ...

随机推荐

  1. linux oracle 启动全过程

    一:启动oracle [root@ccoracle ~]# su -l oracle [oracle@ccoracle ~]$ sqlplus /nolog SQL*Plus: Release 10. ...

  2. 初次比较正式的IT职场面试后几点对自己web开发的思考

    昨天晚上参加一个web开发面试,对于还没有真正毕业的自己来说,web开发的面试不是第一次,暑假就面试几家公司,前几次的面试并没有发现自己对自己学习的专业知识有什么学习态度的问题,因为前几次的面试官都是 ...

  3. 3022Java_运算

    运算 1.运算符分类 算术运算符 二元运算符 +,-,*,/,% 一元运算符 ++,-- 赋值运算符   = 扩展运算符 +=,-=,*=,/= 关系运算符 >,<,>=,<= ...

  4. linux:清空文件内容与批量kill 指定程序名的进程

    1.常规的清空文件内容方法 1)使用 cat命令显示 /dev/null 的内容然后重定向输出到某个文件,来清空 $ cat /dev/null > filename 2)清空一个文件可以通过 ...

  5. 文件识别浅谈(含office文件区分)

    前言 本文主要根据后台接口识别Office文件类型这一话题做一些分享,主要方向还是放在不能获取到文件名情况下的Office文件识别. 可获取到文件名 如果后端接口可以获取到完成的文件名称,则整个过程会 ...

  6. Spark学习之路(十五)—— Spark Streaming 整合 Flume

    一.简介 Apache Flume是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中.Spark Straming提供了以下两种方式用于Flu ...

  7. CI框架使用(一)

    CI框架的使用是很简单,也 是mvc模式.其中有好多类直接调用.   在使用帮助函数的时候,都需要手动加载,或者是在配置文件中加一个自动加载 $this->load->helper('ur ...

  8. Linux命令分类汇总(1~6)

    Linux命令分类汇总 序号 命令 参数 英文释义 功能说明 (一)线上查询及帮助命令(2个) 1 man manual 查看命令帮助,命令的词典,还有info 2 help h 查看Linux内置命 ...

  9. 44 | 测试先行:测试驱动开发(TDD)

  10. 用 IQ分布模拟图来测试浏览器的性能

    今天天气太凉快,跟这个日历上属于夏天的那一页显得格格不入!就连我我床下那台废弃的ThinkPad,居然也十分透凉气,那外壳连我的体温高都没有,于是,我就开始想一个方法,让我那个废弃的电脑发热,顺便用它 ...