1. Webpack
- 安装:
npm install webpack -g
通常我们会将 Webpack 安装到项目的依赖中,这样就可以使用项目本地版本的 Webpack。npm install webpack --save-dev
- 首先创建一个静态页面 index.html 和一个 JS 入口文件 entry.js;然后编译 entry.js 并打包到 bundle.js:
webpack entry.js bundle.js
2. Loader
Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。Loader 可以理解为是模块和资源的转换器,
它本身是一个函数,接受源文件作为参数,返回转换的结果。这样,我们就可以通过 require
来加载任何类型的模块或文件,比如 CoffeeScript、 JSX、 LESS 或图片。
Loader 可以在 require() 引用模块的时候添加,也可以在 webpack 全局配置中进行绑定,还可以通过命令行的方式使用。
我们在页面中引入一个 CSS 文件 style.css,首页将 style.css 也看成是一个模块,然后用css-loader
来读取它,再用style-loader
把它插入到页面中。12/* style.css */body { background: yellow; }修改 entry.js:
123require("!style!css!./style.css") // 载入 style.cssdocument.write('It works.')document.write(require('./module.js'))安装 loader:
1npm install css-loader style-loader重新编译打包
如果每次
require
CSS 文件的时候都要写 loader 前缀,是一件很繁琐的事情。我们可以根据模块类型(扩展名)来自动绑定需要的 loader。
将 entry.js 中的require("!style!css!./style.css")
修改为require("./style.css")
,然后执行:123webpack entry.js bundle.js --module-bind 'css=style!css'// 有些环境下可能需要使用双引号webpack entry.js bundle.js --module-bind "css=style!css"
3. 配置文件
Webpack 在执行的时候,除了在命令行传入参数,还可以通过指定的配置文件来执行。默认情况下,会搜索当前目录的 webpack.config.js 文件,
这个文件是一个 node.js 模块,返回一个 json 格式的配置信息对象,或者通过 –config 选项来指定配置文件。
创建一个配置文件 webpack.config.js
:
|
|
然后运行 webpack
,生成 bundle.js
resolve:
module.loaders 是最关键的一块配置。它告知 webpack 每一种文件都需要使用什么加载器来处理:
|
|
“-loader”其实是可以省略不写的,多个loader之间用“!”连接起来。
插件:
插件可以完成更多 loader 不能完成的功能。
插件的使用一般是在 webpack 的配置信息 plugins
选项中指定。
Webpack 本身内置了一些常用的插件,还可以通过 npm 安装第三方插件。
接下来,我们利用一个最简单的 BannerPlugin
内置插件来实践插件的配置和运行,这个插件的作用是给输出的文件头部添加注释信息。
修改 webpack.config.js
,添加 plugins
:
|
|
Webpack遍历所有的依赖,我们希望避免执行第三方代码比如像jQuery,所以我们可以过滤它。Loaders有 include 和 exclude 两个规则。
它可以配置成一个字符串、正则表达式、一个或调或者其他你希望的,我们希望Babel只执行我们自己的文件,所以我们仅 include
我们自己的资源文件夹:
|
|
运行:
参数--display-error-details
是推荐加上的,方便出错时能查阅更详尽的信息(比如 webpack 寻找模块的过程),从而更好定位到问题:
其他主要的参数有:
4. 开发环境
当项目逐渐变大,webpack 的编译时间会变长,可以通过参数让编译的输出内容带有进度和颜色。
webpack --progress --colors
如果不想每次修改模块后都重新编译,那么可以启动监听模式。开启监听模式后,没有变化的模块会在编译后缓存到内存中,而不会每次都被重新编译,所以监听模式的整体速度是很快的。webpack --progress --colors --watch
当然,使用webpack-dev-server
开发服务是一个更好的选择。它将在 localhost:8080 启动一个 express 静态资源 web 服务器,
并且会以监听模式自动运行 webpack,在浏览器打开 http://localhost:8080/ 或 http://localhost:8080/webpack-dev-server/
可以浏览项目中的页面和编译后的资源输出,并且通过一个 socket.io 服务实时监听它们的变化并自动刷新页面。12345// 安装$ npm install webpack-dev-server -g// 运行$ webpack-dev-server --progress --colors热更新“Live Reload”以及热替换“Hot Module Replacement”(即HMR)
|
|
- 环境NODE_ENV:使用cross-env解决跨平台设置NODE_ENV的问题
- 安装cross-env:
npm install cross-env --save-dev
- 在
NODE_ENV=xxxxxxx
前面添加cross-env
就可以了。123456"scripts": {"test": "webpack --colors","watch": "cross-env NODE_ENV=development webpack --progress --colors --watch","build": "cross-env NODE_ENV=production webpack --colors","server": "webpack-dev-server --open --inline"}
- 安装cross-env:
5. 其他配置
生成单独的css文件:
npm install extract-text-webpack-plugin --save-dev
先安装一下:npm install style-loader css-loader –save-dev,然后再重启下webpack-dev-server,就可以加载样式了,我们发现webpack是把样式动态插到了head标签的style里面,但是一般并不希望直接写到head里面,而是独立的一个css文件,这个时候借助一个分离css的插件就可以了:12345678910111213141516var ExtractTextPlugin = require("extract-text-webpack-plugin");module.exports = {module: {loaders: [// Extract css files{test: /\.css$/,loader: ExtractTextPlugin.extract("style-loader", "css-loader")},]},plugins: [new ExtractTextPlugin("[name].css")]};内置插件OccurenceOrderPlugin :为组件分配ID,通过这个插件webpack可以分析和优先考虑使用最多的模块,并为它们分配最小的ID
- Common chunk:commonChunkPlugin
- 压缩和版本号:内置插件UglifyJsPlugin
- 自动生成 HTML 文件 html-webpack-plugin:
npm install html-webpack-plugin --save-dev
这个插件用来简化创建服务于 webpack bundle 的 HTML 文件,尤其是对于在文件名中包含了 hash 值,而这个值在每次编译的时候都发生变化的情况。
你既可以让这个插件来帮助你自动生成 HTML 文件,也可以使用 lodash 模板加载生成的 bundles,或者自己加载这些 bundles。 - 在一个生成环境构建之前我们也许希望我们的builds文件夹是清空的 clean-webpack-plugin:
npm install clean-webpack-plugin --save-dev
- open-browser-webpack-plugin
Environment flags:Environment flags (source)
You can enable some codes only in development environment with environment flags.main.js
12345document.write('<h1>Hello World</h1>');if (__DEV__) {document.write(new Date());}
index.html
|
|
webpack.config.js
|
|
Now pass environment variable into webpack.
|
|
- webpack如何配置 插入jquery+jquery插件?
如果想引用第三方插件,不通过npm的方式,怎样加载?比如我想用一个jquery的插件,但是npm找不到,我下载到本地之后怎么加载,怎么配置??
目的就是想用webpack + jquery + jquery插件 管理项目,请问webpack怎么配置?
https://github.com/ruanyf/webpack-demos/tree/master/demo12
原来,对于不支持CommonJS规范的模块,需要安装:imports-loader
局部安装:npm install imports-loader --save-dev
然后呢:
entry.js文件设置:var tab = require('imports?$=jquery!./jquery.tab');
webpack.confing.js配置:
6. 我在自己项目里实现的HMR:
|
|