什么是webpack,为什么要使用webpack
我们实现功能丰富的应用,拥有复杂的js代码和一大堆依赖包,模块化,less等css预处理
这些改进确实大大提供了我们开发效率,但是利用他们的开发的文件我们需要额外的处理才能让浏览器识别,手动处理非常复杂,这就为webpack类的工具提供了需求;
1、什么是webpack?
webpack可以看做模块打包机,它做的事情是分析你的项目结构,找到js模块和预设的css,打包为合适的格式以供浏览器使用;
webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(main.js),
webpack将冲这个文件中找到这个项目的所有依赖文件,使用loaders处理它们,最后打包为一个浏览器能识别的JavaScript文件;
2、开始使用webpack
安装:
npm install webpack -g
npm install webpack --save-dev //安装到你的项目中
更快捷的执行打包任务:
对其配置可以使用简单的npm start命令来代替,在package.json中对npm的脚本进行
设置如下:
{
“name”:“”,
“scripts”:{
“start”:“webpack”相当于npm start命令执行npm webpack命令
}
}
在package.json中的脚本部分已经默认在命前面添加了node_modules/.bin路径,
所以无论全局是否安装webpack,在终端都不需要在前面添加详细的路径;
npm的start是一个特殊的脚本名称,在命令行中可以直接使用npm start;
如果你在scripts中配置的不是start,想要在命令行中执行,需要用npm run {scripts name}
比如你配置的是build,需执行命令 npm run bulid;
3、webpack的强大功能
生成 source maps(便于调试)
打包后的文件我们是不容易找到出错地方的,使用source maps帮我们解决此问题;
通过配置,webpack在打包的时候可以为我们生成 source maps,为我们提供一个
对应编译文件和源文件的方法,使编译后的代码可读性高,便于调试;
在webpack的配置文件中配置source maps,需要配置devtool,他有四中不同的配置选项;如下:
在学习阶段以及小到中性的项目上,eval-source-map使用还是比较好的,
但是只能在开发阶段使用它,配置如下
devtool: "eval-source-map"
4、使用webpack构建本地服务器:
浏览器检测代码修改,浏览器时时刷新,webpack提供了一个可选的本地开发服务器;
这个本地服务器基于nodejs构建, 它是一个单独的组件,
在webpack中进行配置之前需要单独安装它作为项目的依赖;
npm install webpack-dev-server --save-dev
webpack 中devserver配置选项
contentBase:默认webpack-dev-server依赖包为为根文件提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应其在这里设置(设置到public目录下);
port:设置默认监听端口,如果省略,默认是8080
inline:设置为true,当源文件修改时会自动刷新页面;
colors:设置为true,使终端输出的文件为彩色的;
historyApiFallback :在开发单页面应用非常有用,它依赖于html5 history api,设置未true,所有的跳转将指向index.html;
devServer: {
contentBase: './public',//温蒂服务器所加载页面的目录;
colors: true,//终端输入结果为彩色
inline: true//实时刷新
}
5.loaders:webpack打包处理器
loaders是webpack激动人心的功能,通过使用不同的loader,webpack通过调用调用外部的脚本或者工具可以对各种各样的文件进行处理,比如说分析json文件并把ta转化为js文件,或者把下一代js文件(es6,es7)转化为现代浏览器可以识别的js文件,或者说对react开发而言,合适的loaders可以把react的jsx文件转化为js文件;
loaders需要单独安装并且自webpack.config.js 下的module关键字进行配置,loadeers的配置选项包括如下:
test:一个匹配loaders处理的文件正在表达式;(必须)
loader:loader的名称(必须)
include/exclude 手动添加必须处理的文件(文件夹)/屏蔽不需要处理文件或者文件夹(可选);
query:为loaders提供额外的设置选项(可选);
loaders很好,不过有点loaders使用起来比较复杂,不如说babel;
5.1 babel
babel其实是一个编译JavaScript的平台,它的强大之处是通过编译达到以下目的:
--处理JavaScript的es6,es7,被浏览器所识别;
--使用基于JavaScript,处理react的jsx;
babel的安装和配置:
babel是几个模块的包,其核心位于称为babel-core的npm包中,不过webpack把他们整合在一起使用,但是对于每一个你单独使用的功能和扩展,你需要单独安装包(比如用的比较多的解析es6的babel-preset-es2015包和解析react的jsx的babel-preset-react包)
我们可以一次性安装多个依赖的模块,之间用空格隔开:
npm install babel-core babel-loader babel-preset-es2015 babel-preset-react
module: {
loaders: [
{
test: /\.json$/,
loader: "json"
},
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel',//在webpack的module部分的loaders里进行配置即可
query: {
presets: ['es2015','react']
}
}
]
},
配置好webpack现在就可以运行使用es6和jsx的语法了,用上面的进行测试,要使用react,必须先安装react和react-dom;
6.一切皆为模块:
webpack有一个不可不说的优点,它把所有的文件都可以当做模块处理,包括你的JavaScript文件,
css,fonts以及图片都可以通过合理的loaders进行模块化处理;
7. css
webpack提供两个工具处理样式表,css-loader和style-loader,两者任务不同,css-loader使你能够使用类似@import和url的方法实现require的功能,style-loader将所有计算后的样式加入页面,两者使用让你把样式嵌套于到webpack打包后的js文件中;
安装:
npm install css-loader style-loader --save-dev
通常的情况下。css和js会打包到一个文件中,css并不会打包为一个独立css文件,不过可以通过合适的webpack配置也可以把css打包一个单独的文件;
7.1 css 预处理器
css的处理平台postcss,他可以帮助你你的css实现更多的功能;
如何使用PostCss,我们使用postcss为css代码处理自动添加适应不同浏览器的css前缀;
首先安装postcss-loader和autoprefixer(自动添加前缀的插件)
npm install postcss-loader autoprefixer
在webapck配置文件中进行配置,只需要新建一个postcss关键字。并在里面申明依赖的插件,
postcss: [
require('autoprefixer')//调用autoprefixer插件
],
到现在,本文已经涉及到处理js的babel和处理css的postcss,他们是两个单独的平台,
8. plugins (插件)
plugins是用来扩展webpack功能的,他会在整个构建过程生效;
loaders和plugins区别:
loaders是webapck进行打包构建过程中对源文件(css,js,jsx,less)进行处理,一次处理一个,
plugins并不是直接操作单个文件,它直接对整个构建过程起作用;
使用插件的方法:
要是用摸个插件,我们需要用npm install 安装它,然后要做的就是webpack配置中的plugins关键字中添加插件的一个实例(plugins是一个数组),下面例子,我们添加了一个实现版权声明的插件
plugins: [
new webpack.BannerPlugin("Copyright Flying Unicorns inc.")//在这个数组中new一个就可以了
],
8.1 几个常用的插件
--- HtmlWebpackPlugin:
这个插件的作用是依据一个简单的模板,帮你生成最终的h5文件,这个文件中自动引用了你打包后的
js文件,每次编译都在文件名插入一个不同的哈希值;
npm instal --save-dev html-webpack-plugin
这个插件完成了我们之前手动完成的一些事情,
--- Hot Module Replacement
webpack配置文件
// 常见的webpack配置文件
var webpack = require('webpack');
var htmlWebPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: __dirname+ '/app/main.js',
output: {
path: __dirname+'/bulid.js',
filename: '[name]-[hash]..js'
},
module: {
loaders: [
{
test: /\.json$/,
loader: 'json'
},
{
test: /\.js$/,
exclude:/node_modules/,
loader: 'babel'
},
{
test: /\.css/,
loader: ExtractTextPlugin.extract('style', 'css?modules!postcss')
}]
},
postcss: [
require('autoprefixer')
],
plugins: [
new HtmlWebpackPlugin({
template: __dirname + "/app/index.tmpl.html"
}),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.optimize.UglifyJsPlugin(),
new ExtractTextPlugin("[name]-[hash].css")
]
}
热门评论
http://webpack.wuhaolin.cn《深入浅出 Webpack》 是国内第一本系统全面讲解 Webpack 的图书,涵盖了 Webpack 的入门、配置、实战、优化、原理。