Webpack
Webpack 介绍
- Webpack 是什么?
- Webpack 能够解决什么问题?
- Webpack 的缺点问题?
- 迁移成本,如何配置 webpack config。
- Webpack 原理、设计理念(待续。。。)
- Webpack 优化(待续。。。)
- Webpack 插件开发(待续。。。)
介绍 Webpack 之前可以先了解一下前端工程化。
前端工程化
- 第一阶段:库/框架选型
- 第二阶段:简单构建优化
- 第三阶段:JS/CSS模块化开发
- 第四阶段:组件化开发与资源管理
前端工程化包含
- 开发规范
- 模块化开发
- 组件化开发
- 组件仓库
- 性能优化
- 项目部署
- 开发流程
- 开发工具
-
…
- 目录结构的制定
- 编码规范
- 前后端接口规范
- 文档规范
- 组件管理
- Git 分支管理
- Commit 描述规范
- 定期 CodeReview
- 视觉图标规范
- …
旧的任务运行工具处理方式:HTML、CSS 和 JavaScript 都是分离的。必须分别对每一项进行管理,并且还要确保所有东西正确地部署到生产环境。
|| || V
即
Web 开发中常用到的静态资源主要有 JavaScript、CSS、图片、Jade 等文件,Webpack 中将静态资源文件称之为模块。Webpack 是一个模块打包工具,其可以兼容多种 js 书写规范,且可以处理模块间的依赖关系,具有更强大的 js 模块化的功能。
Webpack 是什么:
Webpack 一个针对 JavaScript 代码的模块打包工具。—> 个针对所有前端代码的管理工具。
Webpack 为了解决文件依赖管理
。
Webpack 特性:
Webpack 具有 requireJs 和 browserify 的功能,但仍有很多自己的新特性:
- 对 CommonJS 、 AMD 、ES6的语法做了兼容
- 对 js、css、图片等资源文件都支持打包
- 串联式模块加载器以及插件机制,让其具有更好的灵活性和扩展性,例如提供对 CoffeeScript、ES6 的支持
- 有独立的配置文件 webpack.config.js
- 可以将代码切割成不同的 chunk,实现按需加载,降低了初始化时间
- 支持 SourceUrls 和 SourceMaps,易于调试
- 具有强大的 Plugin 接口,大多是内部插件,使用起来比较灵活
- webpack 使用异步 IO 并具有多级缓存。这使得 webpack 很快且在增量编译上更加快
Webpack 的两个最核心的设计哲学分别是:
一切皆模块 正如js文件可以是一个“模块(module)”一样,其他的(如 css、image 或 html)文件也可视作模块。因此,你可以 require(‘myJSfile.js’) 亦可以 require(‘myCSSfile.css’)。这意味着我们可以将事物(业务)分割成更小的易于管理的片段,从而达到重复利用等的目的。
按需加载 传统的模块打包工具(module bundlers)最终将所有的模块编译生成一个庞大的 bundle.js 文件。但是在真实的app里边,“bundle.js”文件可能有 10M 到 15M 之大可能会导致应用一直处于加载中状态。因此 Webpack 使用许多特性来分割代码然后生成多个“bundle”文件,而且异步加载部分代码以实现按需加载。
Webpack 能解决的问题:
- 模块化引用静态文件,统一管理静态文件(JS、CSS、IMAGES)
- 编译 ES6 代码、TypeScript 代码
- 异步加载、按需加载,提取公共代码(CommonsChunkPlugin)
- 压缩文件 + hash
- 自动编译 + 浏览器同步刷新(Webpack dev server、Hot Module Replacement、react-hot-loader)
- 支持使用全局变量 $、React,即不需要每个文件 import jquery
- 开发模式和生产模式
- 配置 publicPath,可修改代码中的文件指向 CDN 路径
- …
缺点
- 配置过多,过于复杂。
- 它使用 bundle 的解决思路在 http/2 的时代可能欠佳。
- 插件的开发较复杂,通常开发插件的时候得熟读源码。
- 官网的文档还不是很全。
- …
对比其他打包器
Feature | webpack/webpack | jrburke/requirejs | substack/node-browserify | jspm/jspm-cli | rollup/rollup | brunch/brunch |
---|---|---|---|---|---|---|
Additional chunks are loaded on demand | yes | yes | no | System.import | no | no |
AMD define |
yes | yes | deamdify | yes | rollup-plugin-amd | yes |
AMD require |
yes | yes | no | yes | no | yes |
AMD require loads on demand |
yes | with manual configuration | no | yes | no | no |
CommonJS exports |
yes | only wrapping in define |
yes | yes | commonjs-plugin | yes |
CommonJS require |
yes | only wrapping in define |
yes | yes | commonjs-plugin | yes |
CommonJS require.resolve |
yes | no | no | no | no | |
Concat in require require("./fi" + "le") |
yes | no♦ | no | no | no | |
Debugging support | SourceUrl, SourceMaps | not required | SourceMaps | SourceUrl, SourceMaps | SourceUrl, SourceMaps | SourceMaps |
Dependencies | 19MB / 127 packages | 11MB / 118 packages | 1.2MB / 1 package | 26MB / 131 packages | ?MB / 3 packages | |
ES2015 import /export |
yes (webpack 2) | no | no | yes | yes | yes, via es6 module transpiler |
Expressions in require (guided) require("./templates/" + template) |
yes (all files matching included) | no♦ | no | no | no | no |
Expressions in require (free) require(moduleName) |
with manual configuration | no♦ | no | no | no | |
Generate a single bundle | yes | yes♦ | yes | yes | yes | yes |
Indirect require var r = require; r("./file") |
yes | no♦ | no | no | no | |
Load each file separate | no | yes | no | yes | no | no |
Mangle path names | yes | no | partial | yes | not required (path names are not included in the bundle) | no |
Minimizing | uglify | uglify, closure compiler | uglifyify | yes | uglify-plugin | UglifyJS-brunch |
Multi pages build with common bundle | with manual configuration | yes | with manual configuration | with bundle arithmetic | no | no |
Multiple bundles | yes | with manual configuration | with manual configuration | yes | no | yes |
Node.js built-in libs require("path") |
yes | no | yes | yes | node-resolve-plugin | |
Other Node.js stuff | process, __dir/filename, global | - | process, __dir/filename, global | process, __dir/filename, global for cjs | global (commonjs-plugin) | |
Plugins | yes | yes | yes | yes | yes | yes |
Preprocessing | loaders, transforms | loaders | transforms | plugin translate | plugin transforms | compilers, optimizers |
Replacement for browser | web_modules , .web.js , package.json field, alias config option |
alias option | package.json field, alias option | package.json, alias option | no | |
Requirable files | file system | web | file system | through plugins | file system or through plugins | file system |
Runtime overhead | 243B + 20B per module + 4B per dependency | 14.7kB + 0B per module + (3B + X) per dependency | 415B + 25B per module + (6B + 2X) per dependency | 5.5kB for self-executing bundles, 38kB for full loader and polyfill, 0 plain modules, 293B CJS, 139B ES2015 System.register before gzip | none for ES2015 modules (other formats may have) | |
Watch mode | yes | not required | watchify | not needed in dev | rollup-watch | yes |
Webpack 配置
最简单的配置
webpack.config.js
1
2
3
4
5
6
7
8
9
var path = require('path');
module.exports = {
entry: './foo.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'foo.bundle.js'
}
};
详细配置可查看阮一峰老师的 github:https://github.com/ruanyf/webpack-demos
References
- Webpack 2 入门教程 https://llp0574.github.io/2016/11/29/getting-started-with-webpack2/
- Webpack 2 快速入门 https://github.com/dwqs/blog/issues/46
- webpack 入门及实践 https://www.w3ctech.com//topic/1557
- 前端工程——基础篇 https://github.com/fouber/blog/issues/10
- React 技术栈系列教程 http://www.ruanyifeng.com/blog/2016/09/react-technology-stack.html
blog comments powered by Disqus