概述

Webpack是一款用户打包前端模块的工具。主要是用来打包在浏览器端使用的javascript的。同时也能转换、捆绑、打包其他的静态资源,包括css、image、font file、template等。个人认为它的优点就是易用,而且常用功能基本都有,另外可以通过自己开发loader和plugin来满足自己的需求。这里就尽量详细的来介绍下一些基本功能的使用。

安装

npm install webpack

运行webpack

webpack需要编写一个config文件,然后根据这个文件来执行需要的打包功能。我们现在来编写一个最简单的config。新建一个文件,命名为webpack-config.js。config文件实际上就是一个Commonjs的模块。内容如下:

var webpack = require('webpack');
var path = require('path'); var buildPath = path.resolve(__dirname,"build"); var nodemodulesPath = path.resolve(__dirname,'node_modules'); var config = { //入口文件配置 entry:path.resolve(__dirname,'src/main.js'), resolve:{ extentions:["","js"]//当requrie的模块找不到时,添加这些后缀 }, //文件导出的配置 output:{ path:buildPath, filename:"app.js" } } module.exports = config;

我的目录结构是这样的:


webpack|---index.html|---webpack-config.js|---src|---main.js |---js |---a.js

main.js文件内容如下:


var a = require('./js/a');
a();
console.log('hello world'); document.getElementById("container").innerHTML = "<p>hello world</p>";

a.js文件内容如下:

module.exports = function(){ console.log('it is a '); }

然后我们执行如下的命令:


webpack --config webpack-config.js --colors

这样我们就能在目录里面看到一个新生成的目录build,目录结构如下:


webpack|---index.html|---webpack-config.js|---build|---app.js

然后引用app.js就Ok啦。main.js和模块a.js的内容就都打包到app.js中了。这就演示了一个最简单的把模块的js打包到一个文件的过程了。

介绍webpack config文件

webpack是根据config里面描述的内容对一个项目进行打包的。接着我们来解释下config文件中的节点分别代表什么意思。一个config文件,基本都是由以下几个配置项组成的。

entry

配置要打包的文件的入口;可以配置多个入口文件,下面会有介绍。

resolve

配置文件后缀名(extensions),除了js,还有jsx、coffee等等。alias配置项,可以为常用模块配置改属性,可以节省编译的搜索时间。例如:

    resolve:{extensions:['.js','.jsx'], alias:{ 'react':path.join(nodeModulesPath,'react/react.js') } }

除了这个功能还可以配置其他有用的功能,由于我还不完全了解,有知道的朋友欢迎指教。

output

配置输出文件的路径,文件名等。

module(loaders)

配置要使用的loader。对文件进行一些相应的处理。比如babel-loader可以把es6的文件转换成es5。大部分的对文件的处理的功能都是通过loader实现的。loader就相当于gulp里的task。loader可以用来处理在入口文件中require的和其他方式引用进来的文件。loader一般是一个独立的node模块,要单独安装。

loader配置项:

test: /\.(js|jsx)$/,           //注意是正则表达式,不要加引号,匹配要处理的文件
loader: 'eslint-loader',       //要使用的loader,"-loader"可以省略
include: [path.resolve(__dirname, "src/app")], //把要处理的目录包括进来 exclude: [nodeModulesPath] //排除不处理的目录

目前已有的loader列表:https://webpack.github.io/docs/list-of-loaders.html

一个module的例子:

module: {preLoaders: [{test: /\.(js|jsx)$/,loader: 'eslint-loader',include: [path.resolve(__dirname, "src/app")], exclude: [nodeModulesPath] }, ], loaders: [ { test: /\.(js|jsx)$/, //正则表达式匹配 .js 和 .jsx 文件 loader: 'babel-loader?optional=runtime&stage=0',//对匹配的文件进行处理的loader exclude: [nodeModulesPath]//排除node module中的文件 } ] }

plugins

顾名思义,就是配置要使用的插件。plugin是比loader功能更强大的插件,能使用更多的wepack api。来看一个使用plugin的例子:

plugins: [//压缩打包的文件new webpack.optimize.UglifyJsPlugin({compress: {//supresses warnings, usually from module minificationwarnings: false}}),//允许错误不打断程序 new webpack.NoErrorsPlugin(), //把指定文件夹xia的文件复制到指定的目录 new TransferWebpackPlugin([ {from: 'www'} ], path.resolve(__dirname,"src")) ]

目前已有的plugins列表:http://webpack.github.io/docs/list-of-plugins.html

如何压缩输出的文件

plugins: [//压缩打包的文件new webpack.optimize.UglifyJsPlugin({compress: { //supresses warnings, usually from module minification warnings: false } })]

如何copy目录下的文件到输出目录

copy文件需要通过插件"transfer-webpack-plugin"来完成。

安装:

npm install transfer-webpack-plugin  -save

配置:

var TransferWebpackPlugin = require('transfer-webpack-plugin');
//其他节点省略
plugins: [//把指定文件夹下的文件复制到指定的目录new TransferWebpackPlugin([ {from: 'www'} ], path.resolve(__dirname,"src")) ]

打包javascript模块

支持的js模块化方案包括:

  • ES6 模块

    import MyModule from './MyModule.js';
  • CommonJS

    var MyModule = require('./MyModule.js');
  • AMD

    define(['./MyModule.js'], function (MyModule) { });

上面已经演示了打包js模块,这里不再重复。ES6的模块需要配置babel-loader来先把处理一下js文件。下面展示下打包ES模块的配置文件:


var webpack = require('webpack');
var path = require('path'); var buildPath = path.resolve(__dirname, 'build'); var nodeModulesPath = path.resolve(__dirname, 'node_modules'); var TransferWebpackPlugin = require('transfer-webpack-plugin'); var config = { entry: [path.join(__dirname, 'src/main.js')], resolve: { extensions: ["", ".js", ".jsx"] //node_modules: ["web_modules", "node_modules"] (Default Settings) }, output: { path: buildPath, filename: 'app.js' }, plugins: [ new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), new webpack.NoErrorsPlugin(), new TransferWebpackPlugin([ {from: 'www'} ], path.resolve(__dirname,"src")) ], module: { preLoaders: [ { test: /\.(js|jsx)$/, loader: 'eslint-loader', include: [path.resolve(__dirname, "src/app")], exclude: [nodeModulesPath] }, ], loaders: [ { test: /\.js$/, //注意是正则表达式,不要加引号 loader: 'babel-loader?optional=runtime&stage=0',//babel模块相关的功能请自查,这里不做介绍 exclude: [nodeModulesPath] } ] }, //Eslint config eslint: { configFile: '.eslintrc' //Rules for eslint }, }; module.exports = config;

打包静态资源

css/sass/less

安装css-loader和style-loader


npm install css-loader --save -dev
npm install style-loader --save -dev

config配置:


var config = {entry:path.resolve(__dirname,'src/main.js'),resolve:{extentions:["","js"] }, output:{ path:buildPath, filename:"app.js" }, module:{ loaders:[{ test:/\.css$/, loader:'style!css', exclude:nodemodulesPath }] } }

style-loader会把css文件嵌入到html的style标签里,css-loader会把css按字符串导出,这两个基本都是组合使用的。打包完成的文件,引用执行后,会发现css的内容都插入到了head里的一个style标签里。如果是sass或less配置方式与上面类似。

images

可以通过url-loader把较小的图片转换成base64的字符串内嵌在生成的文件里。安装:


npm install url-loader --save -dev

config配置:

var config = {entry:path.resolve(__dirname,'src/main.js'),resolve:{extentions:["","js"] }, output:{ path:buildPath, filename:"app.js" }, module:{ loaders:[{ test:/\.css$/, loader:'style!css',// exclude:nodemodulesPath }, { test:/\.png$/,loader:'url-loader?limit=10000'}//限制大小小于10k的 ] } }

css文件内容:


#container{color:#f00; background:url(images/logo-201305.png); /*生成完图片会被处理成base64的字符串 注意:不要写'/images/logo-201305.png',否则图片不被处理*/ }

iconfont

内嵌iconfont的使用方法其实和上述处理png图片的方法一致。通过url-loader来处理。

config配置:


var config = {entry:path.resolve(__dirname,'src/main.js'),resolve:{extentions:["","js"] }, output:{ path:buildPath, filename:"app.js" }, module:{ loaders:[{ test:/\.css$/, loader:'style!css',// exclude:nodemodulesPath }, { test:/\.(png|woff|svg|ttf|eot)$/,loader:'url-loader?limit=10000'}//限制大小小于10k的 ] } }

css文件内容:


@font-face {font-family:'iconfont'; src:url('fonts/iconfont.eot'); /* IE9*/ src:url('fonts/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('fonts/iconfont.woff') format('woff'), /* chrome、firefox */ url('fonts/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ url('fonts/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ }

执行打包后会把字体文件都转换成base64字符串内容到文件里.这里有个头疼的问题,就是每个浏览器支持的字体格式不一样,由于把全部格式的字体打包进去,造成不必要的资源浪费。

打包template

我一大包handlebars的模块为例,来演示下打包模块的过程。有的模板对应的loader,有可能没有现车的,恐怕要自己实现loader。

先安装必须的node模块

npm install handlebars-loader --save -dev
npm install handlebars -save//是必须的

config配置:


var config = {entry:path.resolve(__dirname,'src/main.js'),resolve:{extentions:["","js"] }, output:{ path:buildPath, filename:"app.js" }, module:{ loaders:[ { test: /\.html$/, loader: "handlebars-loader" } ] } }

新建一个模板文件tb.html,目录结构:

webpack|---index.html|---webpack-config.js|---src|---template | |---tb.html |---main.js

main.js中调用模块的代码如下:


var template = require("./template/tp.html");
var data={say_hello:"it is handlebars"}; var html = template(data); document.getElementById('tmpl_container').innerHTML = html;

公用的模块分开打包

这需要通过插件“CommonsChunkPlugin”来实现。这个插件不需要安装,因为webpack已经把他包含进去了。接着我们来看配置文件:

var config = {entry:{app:path.resolve(__dirname,'src/main.js'),vendor: ["./src/js/common"]},//【1】注意这里 resolve:{ extentions:["","js"] }, output:{ path:buildPath, filename:"app.js" }, module:{ loaders:[{ test:/\.css$/, loader:'style!css', exclude:nodemodulesPath } ] }, plugins:[ new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), //【2】注意这里 这两个地方市用来配置common.js模块单独打包的 new webpack.optimize.CommonsChunkPlugin({ name: "vendor",//和上面配置的入口对应 filename: "vendor.js"//导出的文件的名称 }) ] }

目录结构现在是这样的:


webpack|---index.html|---webpack-config.js|---src|---main.js |---js |---a.js //a里面require了common |---common.js

执行webpack会生成app.js和common.js两个文件.

多个入口

config配置:

var config = {    entry:{m1:path.resolve(__dirname,'src/main.js'),m2:path.resolve(__dirname,'src/main1.js')},//注意在这里添加文件的入口resolve:{extentions:["","js"] }, output:{ path:buildPath, filename:"[name].js"//注意这里使用了name变量 } }

webpack-dev-server

在开发的过程中个,我们肯定不希望,每次修改完都手动执行webpack命令来调试程序。所以我们可以用webpack-dev-server这个模块来取代烦人的执行命令。它会监听文件,在文件修改后,自动编译、刷新浏览器的页面。另外,编译的结果是保存在内存中的,而不是实体的文件,所以是看不到的,因为这样会编译的更快。它就想到与一个轻量的express服务器。安装:


npm install webpack-dev-server --save -dev

config配置:


var config = {entry:path.resolve(__dirname,'src/main.js'),resolve:{extentions:["","js"]},//Server Configuration options devServer:{ contentBase: '', //静态资源的目录 相对路径,相对于当前路径 默认为当前config所在的目录 devtool: 'eval', hot: true, //自动刷新 inline: true, port: 3005 }, devtool: 'eval', output:{ path:buildPath, filename:"app.js" }, plugins: [ new webpack.HotModuleReplacementPlugin(),//这个好像也是必须的,虽然我还没搞懂它的作用 new webpack.NoErrorsPlugin() ] }

我的目录结构:


webpack|---index.html|---webpack-config.js//我把静态资源目录配置在了这里|---src|---main.js |---js |---a.js |---common.js

执行命令:


webpack-dev-server --config webpack-dev-config.js  --inline --colors

默认访问地址:

http://localhost:3000/index.html(根据配置会不一样)

有一点需要声明,在index.html(引用导出结果的html文件)里直接引用“app.js”,不要加父级目录,因为此时app.js在内存里与output配置的目录无关:

<script type="text/javascript" src="app.js"></script>

详细文档在这里查看:http://webpack.github.io/docs/webpack-dev-server.html

如何区分开发及生产环境

在webpack.config.js使用process.env.NODE_ENV进行判断在package.json里面的script设置环境变量,注意mac与windows的设置方式不一样

"scripts": {"publish-mac": "export NODE_ENV=prod&&webpack -p --progress --colors","publish-win":  "set NODE_ENV=prod&&webpack -p --progress --colors", "dev-mac": "export NODE_ENV=dev&&webpack-dev-server", "dev-win": "set NODE_ENV=dev&&webpack-dev-server }

常用plugins

  • 代码热替换, HotModuleReplacementPlugin

  • 将css成生文件,而非内联,ExtractTextPlugin

  • 报错但不退出webpack进程,NoErrorsPlugin

  • 代码丑化,UglifyJsPlugin,开发过程中不建议打开

  • 多个 html共用一个js文件(chunk),可用CommonsChunkPlugin

  • 清理文件夹,Clean

  • 调用模块的别名ProvidePlugin,例如想在js中用$,如果通过webpack加载,需要将$与jQuery对应起来

参考文章

* webpack使用优化

  • 2015年12月20日发布

转载于:https://www.cnblogs.com/sugar-tomato/p/5894416.html

[转]WebPack 常用功能介绍相关推荐

  1. WebPack常用功能介绍

    概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.templa ...

  2. 大白菜软件常用功能介绍

    大白菜软件常用功能介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.刻录光盘介绍 1.选择你需要的刻录的光盘 2.点击刻录光盘 3.确认之后点击刻录 4.等待刻录完成 转载于 ...

  3. 程序猿二三事之工具使用-Eclipse调试Java常用功能介绍

    [ TOC ] 调试常用功能介绍 日常java开发中实际写代码的时间并不会很多,花在整理思路,代码重构,调试bug会占用很大部分时间. 熟练掌握调试工具,了解调试相关技巧,是java开发中减少调试时间 ...

  4. Cloudconpare常用功能介绍

    Cloudconpare常用功能 介绍 加载 保存 颜色 渲染 裁剪 合并 滤波 克隆 旋转 抽稀 量距 介绍 Cloudconpare是一款很好用的点云数据处理软件,完全可以满足平时的点云学习要求, ...

  5. DiskGenius常用功能介绍

    DiskGenius常用功能介绍 DiskGenius是我非常喜欢的一个磁盘分区工具,具有快速分区,分区大小调整,磁盘坏道检测等功能,可谓系统安装必备软件. 常用功能: 1.磁盘分区: 2.磁盘坏道检 ...

  6. Android开发自学笔记—1.1(番外)AndroidStudio常用功能介绍

    Android开发自学笔记-1.1(番外)AndroidStudio常用功能介绍 http://www.cnblogs.com/boyliupan/p/4729736.html#_labelTop 回 ...

  7. stm32温度控制按键_干货 | STM32常用功能介绍

    RM校内赛就在眼前,但是咸鱼了一个寒假,对比赛毫无准备,肿么办?? 莫得事!因为我们给大噶带来了新一波干货!今天介绍的STM32单片机,能统领"虾兵蟹将", 大噶好我们是虾兵蟹将( ...

  8. android 最新功能介绍,Android Studio 常用功能介绍

    界面介绍 讲解1 这个界面,显示了我们使用 Android Studio时经常接触到的功能面板. Project 面板. 用于浏览项目文件. Project 面板会显示当前的所有的 module .  ...

  9. Charles使用及常用功能介绍

    Charles是一款常用的网络抓包工具,启动Charles后,会自动开启的浏览器代理进行网络请求截取,Charles和Fiddler基本功能差不多,只是Fiddler是免费的,但是没有MAC版,Cha ...

最新文章

  1. Mac下安装配置Python2和Python3并相互切换使用
  2. php安卓直播抓取,hls,android_安卓大部分浏览器播放HLS协议直播流会从头开始,hls,android,ffmpeg,m3u8 - phpStudy...
  3. MongoDB (六) MongoDB 集合操作
  4. Nagios之linux监控windows主机
  5. spark算子的分类
  6. Obsolete属性用法
  7. Apache Flink 中文社区视频号上线!和大咖们线上见面~
  8. python读取sas数据集_Python 数据处理库 pandas 入门教程基本操作
  9. Mac Eclipse 主题选择
  10. 计算机主机的三大部分,计算机系统的三大组成部分
  11. 软件缺陷的生命周期(二)
  12. 张量(五):张量学习——BGCP
  13. 18年华为没有一项原创的发明
  14. PPT设计的四大基本原则(对齐)
  15. Android版简历(二)
  16. LearnOpenGL_study -- 光照贴图
  17. 斯坦福CS231N深度学习与计算机视觉
  18. Intel Movidius Neural Computer Stick 2使用(PC-Based Ubuntu)
  19. Dev c++ 5.11 调试方法入门 初学者适用
  20. Windows下Jmeter的下载与安装

热门文章

  1. 【ASP.NET Web API教程】2.3.3 创建Admin控制器
  2. sshd系统自带启动脚本详解
  3. RequestResponse总结
  4. ACCP学习旅程之----- 使用HTML语言开发商业站点(第一章 HTML的基本标签)
  5. 关于火狐(firefox4)
  6. Exchange 2007 内存使用问题
  7. BPM实例分享:如何设置表单字体样式
  8. jQuery基础---filter()和find()
  9. Win7下基于消息安全模式的WCF托管(IIS与WinForm)
  10. 随机生成文件名字或随机生成一个数