Webpack概念
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.json的scripts下加入
"scripts": {
"webpack": "webpack"
}
接着在当前目录启动终端,输入
npm run webpack
这个时候就能看到webpack把src入口的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有两个配置项:
- filename
filename 用于配置输出文件的文件名 - 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-loader,css-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提供了更多自定义的能力。webpack的plugin具有apply方法,并且会在webpack编译时调用,通过在plugin对象中对webpack提供的各种hook做操作,达到我们修改bundle的目的。
官网的一个例子:
const pluginName = "ConsoleLogOnBuildWebpackPlugin";
class ConsoleLogOnBuildWebpackPlugin {
apply(compiler) {
compiler.hooks.run.tap(pluginName, compilation => {
console.log("webpack 构建过程开始!");
});
}
}
mode
mode比较简单,通常来说,有两种内置mode,development和production,可以通过webpack.config.js配置,或者通过CLI参数传递。
module.exports = {
mode: "production"
};
webpack --mode=production
设置了mode之后,nodejs进程中的process.env.NODE_ENV也会被同步设置。
webpack对于mode有一些自己的区分,在production模式下,会打开代码压缩、去除一些热更新的代码等,在生产环境中切记要将mode设置为production。
Webpack概念的更多相关文章
- Webpack 概念
概念 webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图表(dependency ...
- [WIP]webpack 概念
创建: 2019/04/09 概念 入口 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始. 进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖 ...
- webpack——概念的引入
## 在网页中会引用哪些常见的静态资源?+ JS - .js .jsx .coffee .ts(TypeScript 类 C# 语言)+ CSS - .css .less .sass .scss+ I ...
- 1.WebPack概念
一.什么是WebPack 官方解释:本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构 ...
- Webpack 入门指迷--转载(题叶)
最近看到这个东西,一头雾水.看了一些资料了解了Webpack概念,大体是webpack 是一个模块绑定器,主要目的是在浏览器上绑定 JavaScript 文件. 看到题叶写的一篇介绍,写的很好,转载连 ...
- webpack3中文版使用参考文档--全面解析webpack.config.js
Webpack目前官方发布的最新版本是3.1.0,相对于2.0的怎么本,在语法上没有变动,只是新增了功能.使用webpack,需要事先安装node.js,并对node.js生态有一些基本的了解,比如( ...
- 理解 Gulp 和 Webpack(转)
Gulp 和 webpack 之间的关系是十分暧昧的,却也经常被人误解,以为它俩是竞争关系,其实不然. Gulp 是一个任务管理工具,让简单的任务更清晰,让复杂的任务易于掌控:而 webpack 的理 ...
- Webpack 打包工具
1. webpack 概念 [文档地址](https://www.webpackjs.com/concepts/) 2. webpack 命令使用及相关工具包 1. webpack 安装和打包命令: ...
- 转:Cesium 和 Webpack
原文地址:https://www.jianshu.com/p/85917bcc023f 注意:webpack 和 webpack-cli 的安装参考 https://www.cnblogs.com/m ...
随机推荐
- python列表和字典的迭代
1.列表和字典的迭代 程序开发中,对列表和字典进行迭代是非常常见的事情. 字典一般可以选择对key进行迭代.对value迭代和对key/value一起迭代 >>> d = {'a': ...
- vue+element——父级元素fixed,遮罩会在上方
前言 这种场景还是蛮场景的 一个共用的head组件,组件里面通常是当前系统登录账号名 退出登录 修改密码这样的弹框 但是现在我又想head不跟着main内容上下滑动.所以用了fixed 定位. 问题来 ...
- nvm淘宝源升级安装最新稳定版nodejs
为了在服务器上面升级nodejs,用nvm下载实在太慢了,推荐淘宝源安装命令,非常快能安装好: 第一步: NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mi ...
- Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制
在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...
- K-近邻算法介绍与代码实现
声明:如需转载请先联系我. 最近学习了k近邻算法,在这里进行了总结. KNN介绍 k近邻法(k-nearest neighbors)是由Cover和Hart于1968年提出的,它是懒惰学习(lazy ...
- 如何使用共享网卡的NAT模式配置VMware12中的CentOS6.7的上网功能
1.首先共享网卡的NAT模式是通过win10中的VMnet8来通信的,如下双击VMnet8 2.点击[详细信息]查看VMnet8的IPV4地址为192.168.232.110,掩码为255.255.2 ...
- 数读 | 为什么运维朋友们都需要学Python?
运维人员需不需要学开发?需不需要学Python?PythonN和Shell有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲. 现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能, ...
- BZOJ 2152:聪聪可可(树上点分治)
题目链接 题意 中文题意. 思路 和上一题类似,只不过cal()函数需要发生变化. 题目中要求是3的倍数,那么可以想到 (a + b) % 3 == 0 和 (a % 3 + b % 3) % 3 = ...
- HDU 1007:Quoit Design(分治求最近点对)
http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:平面上有n个点,问最近的两个点之间的距离的一半是多少. 思路:用分治做.把整体分为左右两个部分,那么 ...
- python数据库-MySQL与python的交互
一.python3中安装PyMySQL模块 命令安装: sudo apt-get install python-mysql 或者 pip install pymysql 2.使用在pyCharm中安装 ...