webpack是什么
官网是这么说的:
webpack is a module bundler.
即:
webpack 是一个模块捆绑器
我们告诉它入口模块,这个文件会依赖其他模块,经过webpack的处理,最终输出包含所有依赖模块的集成模块。这个集成模块不一定是单个模块,有时候为了按需加载,不是所有模块都被捆绑进主模块。输出的模块一般用于浏览器,我看到服务端代码也用webpack的- -
webpack有一个宗旨:一切皆模块
无论我们依赖的是js,css,less,json,图片,任何格式的文件都可以,统统require就搞定。
这里就要引出另外一个概念:loader。
loader是什么呢,顾名思义,就是加载器,我们需要为所有类型的模块指定相应类型的loader(js除外,在webpack出现之前,我们已经把js文件称为模块已经好多年了)。比如:
css
=>css-loader
less
=>less-loader
json
=>json-loader
es6模块
=>babel-loader
二进制文件
=>file-loader
png
=>url-loader
loader可以链式调用,比如less模块,被less-loader
处理完后可以被css-loader
处理,再继续被style-loader
处理。
另外,这里可以提一下,url-loader
继承了file-loader
, 如果模块的大小,小于指定值,则会返回一个Data Url以减少http请求,对于小图片的处理非常有用!
很多人说,webpack是grunt,gulp之后的替代品。
然而,这并不完全正确!
webpack只是一个模块捆绑器,它只能处理从入口模块开始涉及到的模块,没有被直接或间接依赖的模块它都无法处理, 特殊的任务还是需要grunt,gulp等工具来完成的!因此,webpack和gulp搭配才是王道!
webpack有丰富的插件与loader,用来满足我们的大部分需求,只需要少量配置就可以处理原本通过grunt或gulp非常多配置或代码才能实现的功能!
webpack支持的依赖加载写法
- CommonJs: 即
require('a.js')
- AMD:
require(['a.js'], function (a) {})
- ES6 module:
import b from 'b'
,需借助babel-loader
- require.ensure: 123require.ensure(['c.js'], function (require) {var c = require('c.js')})
这是webpack提供的特殊语法,用于按需加载异步模块,跟AMD模式效果类似
webpack使用方式
- 命令行: 运行后直接输出文件到磁盘,也可以使用watch模式,检测文件变化后,自动打包输出新的文件。
- node服务中间件: 在开发阶段使用,将每次生成的模块存放在内存(重新打包速度更快),通过url的方式访问,与node服务完美结合。中间件方式主要有两个方案,一个是官方提供的webpack-dev-server,一个是开发者自行搭配express或koa,npm都有相应的中间件模块。后者相对复杂,但是具备更灵活的配置。
基本使用
阮一峰老师有一个非常好的教程仓库,非常推荐大家clone下来跑一跑,地址:https://github.com/ruanyf/webpack-demos
其实,这里有一丢丢标题党的嫌疑,说好的入门呢。好吧,那我就非常厚脸皮的贴一段官方代码吧,最少配置:
然后执行:
就在当前bin目录下生成app.bundle.js啦,入门了吧~
我们如何使用webpack
重头戏终于来啦,这里是实战部分。
我们使用的是Vuejs, 作者尤大提供了vue-loader用于加载vue模块,而且还提供了vue-cli这个项目用于脚手架,我们的webpack配置正是基于这个项目改造而来,顺便安利一下我们的基于yeoman的脚手架 generator-vue-workflow.
其实我最初接触webpack是因为React,当初找了很多网上的demo,都没有找到符合心中所想的webpack配置,看了好久官网也云里雾里(其实真正想配好wepback并不简单),直到遇到vue-cli这个项目,才找到我想要的,然后慢慢优化,渐渐完美~
我们的项目根目录会存在这三个webpack相关的配置文件:
webpack.base.conf.js
:基础配置,此模块会被以下两个模块依赖webpack.dev.conf.js
:开发阶段的webpack配置,比如热替换,css注入style标签等webpack.prod.conf.js
:打包生产环境模块的配置, 比如压缩js,提取css到文件等
————————— 注意!前方高能! ———————————–
以下是三个文件的详细配置,注释中会解释每一项配置的作用。
|
|
类似的代码,就不重复说明了奥
再贴出部分server的代码:
目前这套配置是用于真实项目的,也是我积累了大半年踩各种坑锤炼出来的,希望以上的注释能帮到大家理解webpack。
以上配置,只在开发阶段用到了node服务,线上是没有部署node服务的。
最近有一个项目部署了koa2服务,同时也用到了webpack,配置方式与上述有些不同,等比较稳定后再来一篇文章说说这个怎么玩~