webpack简单入门
- 多次加载同一个库
- 依赖加载混乱
- 不时会引入多余的CSS或JavaScript代码或文件
- 不方便优化资源
npm install webpack -g
webpack
已经安装到了全局环境下,可以通过命令行 webpack -h
试试。demo
,然后使用cmd
命令行定位到这个文件目录(比如:D盘中的demo)下,然后执行下面的命令:npm init // 初始化npm
demo
文件夹里多了一个package.json
文件,它是npm的一个配置文件,包括当前项目的依赖模块,自定义的脚本任务等等。npm init
时,终端会问你一系列诸如项目名称,项目描述,作者等信息,不过不用担心,如果你不准备在npm中发布你的模块,这些问题的答案都不重要,回车默认即可。webpack
的安装,通常我们会将 webpack
安装到项目的依赖中,这样就可以给不同的项目使用不同版本的webpack
。npm install webpack --save-dev
app
和public
。其中app
文件夹用来存放原始数据和JavaScript模块;public
文件夹用来存放HTML以及打包后的JS文件。public
文件夹里创建一个静态页面index.html
,添加如下代码:<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!--bundle.js是打包后的js文件-->
<script src="bundle.js"></script>
</body>
</html>
entry.js,
添加如下代码:document.write('Hello World!');
entry.js
编译成bundle.js
,文件目录中多了一个bundle.js
:webpack app/entry.js public/bundle.js
public
文件夹下多了一个bundle.js
,这就是webpack打包后的js文件,也是我们的HTML文件中需要引入的文件。public
文件夹中的index.html
文件,你会在浏览器中看到输出的“Hello World
!”。webpack.config.js
)来配置打包,所以在demo
文件夹中创建webpack.config.js
文件,然后添加如下代码:module.exports = {
entry: __dirname + '/app/entry.js',
output: {
filename: 'bundle.js',
path: __dirname + '/public'
}
}
entry
就是我们的入口文件,可以有多个入口文件,而output
即为webpack
打包的输入对象,filename
为输出文件名,path
为输出路径。__dirname
”(双下划线),它是node.js中的一个全局变量,它指向当前执行脚本所在的目录。webpack --config webpack.config.js
webpack
webpack.config.js
文件。5、资源压缩
如果我们需要对打包后的代码进一步压缩处理,我们可以运行命令:
webpack -p
其他命令:
webpack --config XXX.js //使用另一份配置文件(比如webpack.config2.js)来打包
webpack --watch //监听变动并自动打包
webpack -p //压缩混淆脚本
webpack -d //生成map映射文件,告知哪些模块被最终打包到哪里
6、强大的Loaders
webpack只能处理原生js模块,但是loaders
可以将各种资源转换为js模块,但在使用前,我们需要安装Loader
。当然,Loader不止一种:
npm install css-loader style-loader url-loader babel-loader --save-dev
css-loader
:CSS文件处理style-loader
:为了在html中以style的方式嵌入cssurl-loader
:图片资源处理babel-loader
:处理包含ES6、JSX等文件
注:--save-dev就是声明在开发阶段需要用到webpack,并且自动把webpack依赖写到package.json配置文件上面,生产环境就不需要安装。
所有 loader
最终的输出都是返回字符串。这使得 webpack
可以把他们都打包进 Javascript 模块当中。
配置loaders
安装完各个loader
后,我们还需要在webpack.config.js
中配置一下,以便加载进需要的loader。
我们需要添加module.loaders
,这是最关键的一个配置。它告知 webpack 对每一种文件都需要使用什么加载器来处理。
loaders是一个数组,里面元素都是一个对象,每个对象都有相应的参数:
test
:必须,一个匹配loaders所处理的文件的拓展名的正则表达式;loader
:必须,相应loader的名称include/exclude
:可选,手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹);query
:可选,为loaders提供额外的设置选项
接着上面的例子,我们修改一下webpack.config.js
中的代码:
module.exports = {
entry: __dirname + '/app/entry.js',
output: {
filename: 'bundle.js',
path: __dirname + '/public'
},
// 新添加的module属性
module: {
loaders: [
{ test: /\.css$/, loader: "style!css" },
{ test: /\.(jpg|png)$/, loader: "url?limit=8192" }
]
}
}
在上面的例子中,匹配到文件后缀名尾.js
就用babel-loade
r,匹配到文件后缀名为.css
的就先用css
,最后用style
处理。不同的处理器通过 !
分隔并串联起来。
此外,处理图片时,limit=8192
的意思是不大于8KB(1024×8)的图片才会被打包处理为base64的图片
注意:这里我们省略掉 -loader
,也就是原本应该写成 style-loader!css-loader
,我们可以写成style!css
。
我们在上面创建的app
文件夹里新建一个style.css
文件,往里面添加如下代码:
body { background: red; }
修改一下entry.js
:
require("!style-loader!css-loader!./style.css") // 载入 style.css
document.write('Hello World!');
然后再执行一次:
webpack
刷新一下浏览器中的index.html页面,你会看到背景变红了!
7、插件
webpack还提供了很多插件,插件可以完成更多 loader
不能完成的功能。一般是在 webpack 的配置信息 plugins
选项中指定。webpack
本身内置了一些常用的插件,还可以通过 npm 安装第三方插件。
示例:
如果使用内置的插件,首先要加载webpack:
var webpack = require('webpack')
然后就可以在plugins
里添加插件,比如下面的BannerPlugin
,用来给文件头部添加注释信息的:
plugins: [
new webpack.BannerPlugin('头部注释')
]
8、调试
开发总是离不开调试。而Source Maps
就是为调试而生的。
在webpack
的配置文件中配置source maps
,需要配置devtool
,它有以下7种不同的配置选项:
eval
:每个module会封装到 eval 里包裹起来执行,并且会在末尾追加注释 //@ sourceURL.source-map
:在一个单独的文件中产生一个完整且功能完全的SourceMap文件。hidden-source-map
:和 source-map 一样,但不会在 bundle 末尾追加注释。inline-source-map
:生成一个 DataUrl 形式的 SourceMap 文件.cheap-source-map
:生成一个没有列信息(即同行显示)的SourceMaps文件,不包含loader的 sourcemap(比如 babel 的 sourcemap)eval-source-map
:使每个module会通过eval()来执行,并且生成一个DataUrl形式的SourceMap。cheap-module-source-map
:生成一个没有列信息(即同行显示)的SourceMaps文件,同时 loader 的 sourcemap 也被简化为只包含对应行的。
webpack 不仅支持这 7 种,而且它们还是可以任意组合上面的eval、inline、hidden关键字,比如,你可以设置 souremap 选项为 cheap-module-inline-source-map。
目前个人对这7种模式还不是完全了解,如有好的文章可告知!
配置示例:
module.exports = {
devtool: 'eval-source-map', // 配置生成Source Maps
entry: __dirname + "entry.js",
output: {
path: __dirname + "/dist",
filename: "bundle.js"
}
}
9、开启服务
使用webpack,我们还可以构建一个简单的本地服务,不过这个本地服务器是基于Node.js的,所以我们需要安装它:
npm install webpack-dev-server --save-dev
然后运行以下命令:
webpack -dev-server
上面的命令执行完毕后,我们就可以通过127.0.0.1:8080/public
或者localhost:8080/public
访问public
文件夹中的index.html
页面了!
当然,我们还可以在配置文件webpack.config.js
配置服务相关的参数:
devServer: {
contentBase: "./public",
colors: true,
historyApiFallback: true,
inline: true,
port: '8080'
}
参数说明:
contentBase
:默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public"目录)port
:设置默认监听端口,如果省略,默认为”8080“inline
: 设置为true,当源文件改变时会自动刷新页面colors
: 设置为true,使终端输出的文件为彩色的historyApiFallback
: 在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html
当需要停止本地服务器时,你可以输入Ctrl+c终止。
总结
到这里,相信你已经入门webpack了!如果你想了解更多关于webpack,可进入这里:传送门
如有错误或建议,欢迎在下方的评论区留言!