Webpack
的原因Webpack
相关技术栈,是提升前端生产力的利器Webpack
在前端项目中实践模块化思想Webpack
本质上是一个模块化打包工具,它通过“万物皆模块”这种设计思想,巧妙地实现了整个前端项目的模块化。Webpack
本身的架构中有两个很核心的特性,分别是 Loader 机制和插件机制。Webpack
慢慢发展成了现在很多前端开发者眼中的构建系统。Webpack
的设计思想比较先进,起初的使用过程比较烦琐,再加上文档也晦涩难懂,所以在最开始的时候,Webpack
对开发者并不友好,但是随着版本的迭代,官方文档的不断更新,目前 Webpack
对开发者已经非常友好了。Webpack
作为目前最主流的前端模块打包器,提供了一整套前端项目模块化方案,而不仅仅局限于对 JavaScript 的模块化。通过 Webpack
,我们可以轻松的对前端项目开发过程中涉及的所有资源进行模块化。Webpack
的基本使用其实并不复杂,特别是在 Webpack 4
以后,很多配置都已经被简化了,在这种配置并不复杂的前提下,开发人员对它的掌握程度主要就体现在了是否能够理解它的工作机制和原理上了。Webpack
这类工具的认知程度,是辨别前端开发人员优秀与否的分水岭。Webpack
和模块化└─ stage-1
├── module-a.js
├── module-b.js
└── index.html
// module-a.js
function foo () {
console.log('moduleA#foo')
}
// module-b.js
var data = 'something'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>第一阶段</title>
</head>
<body>
<script src="module-a.js"></script>
<script src="module-b.js"></script>
<script>
foo()
// console.log(data)
data = 'other'
</script>
</body>
</html>
// module-a.js
window.moduleA = {
method1: function () {
// console.log('moduleA#method1')
}
}
// module-b.js
window.moduleB = {
data: 'something'
method1: function () {
// console.log('moduleB#method1')
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>第二阶段</title>
</head>
<body>
<script src="module-a.js"></script>
<script src="module-b.js"></script>
<script>
moduleA.method1()
moduleB.method1()
moduleA.data = 'foo'
</script>
</body>
</html>
// module-a.js
;(function () {
var name = 'module-a'
function method1 () {
console.log(name + '#method1')
}
window.moduleA = {
method1: method1
}
})()
// module-b.js
;(function () {
var name = 'module-b'
function method1 () {
console.log(name + '#method1')
}
window.moduleB = {
method1: method1
}
})()
// module-a.js
;(function ($) { // 通过参数明显表明这个模块的依赖
var name = 'module-a'
function method1 () {
console.log(name + '#method1')
$('body').animate({ margin: '200px' })
}
window.moduleA = {
method1: method1
}
})(jQuery)
<!DOCTYPE html>
<html>
<head>
<title>模块化的演进过程</title>
</head>
<body>
<script src="https://unpkg.com/jquery"></script>
<script src="module-a.js"></script>
<script src="module-b.js"></script>
<script>
moduleA.method1()
moduleB.method1()
</script>
</body>
</html>
CommonJS
规范是以同步的方式加载模块。CommonJS
规范,而是专门为浏览器端重新设计了一个规范,叫做 AMD ( Asynchronous Module Definition) 规范,即异步模块定义规范。CommonJS
,在使用上基本和 AMD 相同,可以算上是重复的轮子。CommonJS
规范来组织模块。Webpack
:Webpack
作为一个模块打包工具,本身就可以解决模块化代码打包的问题,将零散的 JavaScript 代码打包到一个 JS 文件中。Webpack
可以在打包过程中通过 Loader 机制对其实现编译转换,然后再进行打包。Webpack
支持在 JavaScript 中以模块化的方式载入任意类型的资源文件,例如,我们可以通过 Webpack
实现在 JavaScript 中加载 CSS 文件,被加载的 CSS 文件将会通过 style 标签的方式工作。Webpack
Webpack
作为模块化打包工具Webpack
还具备代码拆分的能力,它能够将应用中所有的模块按照我们的需要分块打包。这样就不用担心全部代码打包到一起,产生单个文件过大,导致加载慢的问题。我们可以把应用初次加载所必需的模块打包到一起,其他的模块再单独打包,等到应用工作过程中实际需要用到某个模块,再异步加载该模块,实现增量加载,或者叫作渐进式加载,非常适合现代化的大型 Web 应用。Webpack
快速上手└─ 02-configuation
├── src
│ ├── heading.js
│ └── index.js
└── index.html
// ./src/heading.js
export default () => {
const element = document.createElement('h2')
element.textContent = 'Hello webpack'
element.addEventListener('click', () => alert('Hello webpack'))
return element
}
// ./src/index.js
import createHeading from './heading.js'
const heading = createHeading()
document.body.append(heading)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Webpack - 快速上手</title>
</head>
<body>
<!- type="module" 表示是一个模块 ->
<script type="module" src="src/index.js"></script>
</body>
</html>
Webpack
这样的工具,将拆分的 JS 代码再次打包到一起。Webpack
去处理上述案例中的 JS 模块打包。webpack
是 Webpack
的核心模块,webpack-cli
是 Webpack
的 CLI 程序,用来在命令行中调用 Webpack
。webpack-cli
所提供的 CLI 程序就会出现在 node_modules/.bin
目录当中,我们可以通过 npx
快速找到 CLI 并运行它,具体操作如下:
$ npx webpack --version v4.42.1npx
是 npm 5.2
以后新增的一个命令,可以用来更方便的执行远程模块或者项目 node_modules 中的 CLI 程序。Webpack
版本是 v4.42.1
,有了 Webpack
后,就可以直接运行 webpack
命令来打包 JS 模块代码,具体操作如下:
$ npx webpackWebpack
会自动从 src/index.js
文件开始打包,然后根据代码中的模块导入操作,自动将所有用到的模块代码打包到一起。index.js
有两个 JS 文件被打包到了一起。与之对应的就是项目的根目录下多出了一个 dist
目录,我们的打包结果就存放在这个目录下的 main.js
文件中。index.html
中修改引入文件的路径,由于打包后的代码就不会再有 import 和 export 了,所以我们可以删除 type="module"
。再次回到浏览器中,查看这个页面,这时我们的代码仍然可以正常工作,index.html
的代码如下所示:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Webpack - 快速上手</title>
</head>
<body>
<script src="dist/main.js"></script>
</body>
</html>
Webpack
命令定义到 npm scripts
中,这样每次使用起来会更加方便,具体如下:{
"name": "01-getting-started",
"version": "0.1.0",
"main": "n/a",
"author": "zce <w@zce.me> (https://zce.me)",
"license": "MIT",
"scripts": {
"build": "webpack"
},
"devDependencies": {
"webpack": "^4.42.1",
"webpack-cli": "^3.3.11"
}
}
Webpack
最基本的使用的总结webpack
相关的 npm
包,然后使用 webpack-cli
所提供的命令行工具进行打包。Webpack
的打包过程Webpack 4
以后的版本支持零配置的方式直接启动打包,整个过程会按照约定将 src/index.js
作为打包入口,最终打包的结果会存放到 dist/main.js
中。src/main.js
,那此时我们通过配置文件的方式修改 Webpack
的默认配置,在项目的根目录下添加一个 webpack.config.js
,具体结构如下:└─ 02-configuation
├── src
│ ├── heading.js
│ └── main.js
├── index.html
├── package.json
+ └── webpack.config.js ···················· Webpack 配置文件
webpack.config.js
是一个运行在 Node.js
环境中的 JS 文件,也就是说我们需要按照 CommonJS
的方式编写代码,这个文件可以导出一个对象,我们可以通过所导出对象的属性完成相应的配置选项。Webpack
打包的入口文件路径。我们将其设置为 src/main.js
,具体代码如下所示:// ./webpack.config.js
module.exports = {
entry: './src/main.js'
}
Webpack
就会从 src/main.js
文件开始打包。entry
的配置以外,还可以通过 output
属性设置输出文件的位置。output
属性的值必须是一个对象,通过这个对象的 filename
指定输出文件的文件名称,path
指定输出的目录,具体代码如下所示:// ./webpack.config.js
const path = require('path')
module.exports = {
entry: './src/main.js',
output: {
filename: 'bundle.js',
path: path.join(__dirname, 'output')
}
}
webpack.config.js
是运行在 Node.js
环境中的代码,所以直接可以使用 path 之类的 Node.js
内置模块。Webpack
相关的配置可以在 Webpack
的官网中找到:https://webpack.js.org/configuration/#optionsWebpack
的配置项比较多,而且很多选项都支持不同类型的配置方式。如果开发工具能够为 Webpack
配置文件提供智能提示的话,配置效率和准确度也会大大提高。VSCode
对于代码的自动提示是根据成员的类型推断出来的,换句话说,如果 VSCode
知道当前变量的类型,就可以给出正确的智能提示。即便你没有使用 TypeScript
这种类型友好的语言,也可以通过类型注释的方式去标注变量的类型。VSCode
并不知道 Webpack
配置对象的类型,我们通过 import
的方式导入 Webpack
模块中的 Configuration
类型,然后根据类型注释的方式将变量标注为这个类型,这样我们在编写这个对象的内部结构时就可以有正确的智能提示了,具体代码如下所示:// ./webpack.config.js
import { Configuration } from 'webpack'
/**
* @type {Configuration}
*/
const config = {
entry: './src/index.js',
output: {
filename: 'bundle.js'
}
}
module.exports = config
import
语句只是为了导入 Webpack
配置对象的类型,这样做的目的是为了标注 config
对象的类型,从而实现智能提示。在配置完成后一定要记得注释掉这段辅助代码,因为在 Node.js
环境中默认还不支持 import
语句,如果执行这段代码会出现错误。// ./webpack.config.js
// 一定记得运行 Webpack 前先注释掉这里。
// import { Configuration } from 'webpack'
/**
* @type {Configuration}
*/
const config = {
entry: './src/index.js',
output: {
filename: 'bundle.js'
}
}
module.exports = config
Webpack
工作模式Webpack 4
新增了一个工作模式的用法,这种用法大大简化了 Webpack
配置的复杂程度。你可以把它理解为针对不同环境的几组预设配置:
+ production 模式下,启动内置优化插件,自动优化打包结果,打包速度偏慢; + development 模式下,自动优化打包速度,添加一些调试过程中的辅助插件; + none 模式下,运行最原始的打包,不做任何额外处理。Webpack
将默认使用 production 模式
去工作。production 模式
下 Webpack
内部会自动启动一些优化插件,例如,自动压缩打包后的代码。这对实际生产环境是非常友好的,但是打包的结果就无法阅读了。Webpack
工作模式的方式有两种:
+ 通过 CLI --mode 参数传入; + 通过配置文件设置 mode 属性。Webpack
工作模式的详细差异可以在官方文档中查看:https://webpack.js.org/configuration/mode/Webpack
打包后生成的 bundle.js 文件,深入了解 Webpack
是如何把这些模块合并到一起,而且还能正常工作的。Webpack
工作模式设置为 none
,这样 Webpack
就会按照最原始的状态进行打包,所得到的结果更容易理解和阅读。none
模式打包完成后,打开最终生成的 bundle.js
文件。bundle.js
文件来深入深入了解 Webpack
。bundle.js
的执行过程,可以把它运行到浏览器中,然后通过 Chrome
的 Devtools
单步调试一下。扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有