webpack构建服务器(webpack起服务)「webpack搭建本地服务器」

  插件(Plugins)

  插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中见效,实行相干的任务。

  Loaders和Plugins常常被弄混,但是他们着实是完全差别的东西,可以这么来说,loaders是在打包构建过程中用来处理惩罚源文件的(JSX,Scss,Less..),一次处理惩罚一个,插件并不直接操纵单个文件,它直接对整个构建过程其作用。

  Webpack有很多内置插件,同时也有很多第三方插件,可以让我们完成更加丰富的功能。

  利用插件的方法

  要利用某个插件,我们必要通过npm安装它,然后要做的就是在webpack设置中的plugins关键字部分添加该插件的一个实例(plugins是一个数组)继承看例子,我们添加了一个实现版权声明的插件。

  //webpack.config.jsvarwebpack=require('webpack');module.exports={devtool:'eval-source-map',entry:__dirname+"/app/main.js",output:{...},module:{loaders:[{test:/.json$/,loader:"json"},{test:/.js$/,exclude:/node_modules/,loader:'babel'},{test:/.css$/,loader:'style!css?modules!postcss'}//这里添加PostCSS]},postcss:[require('autoprefixer')],plugins:[newwebpack.BannerPlugin("CopyrightFlyingUnicornsinc.")//在这个数组中new一个就可以了],devServer:{...}}

  通过这个插件,打包后的JS文件表现如下

  

  bundledJavafile

  知道Webpack中的插件怎样利用了,下面给各人保举几个常用的插件

  HtmlWebpackPlugin

  这个插件的作用是依据一个简单的模板,帮你天生终极的HTML5文件,这个文件中主动引用了你打包后的JS文件。每次编译都在文件名中插入一个差别的哈希值。

  安装

  npminstall--save-devhtml-webpack-plugin

  这个插件主动完成了我们之前手动做的一些事变,在正式利用之前必要对不停以来的项目布局做一些改变:

移除public文件夹,利用此插件,HTML5文件会主动天生,别的CSS已经通过前面的操纵打包到JS中了,public文件夹里。

在app目次下,创建一个Html文件模板,这个模板包罗title等别的你必要的元素,在编译过程中,本插件会依据此模板天生终极的html页面,会主动添加所依靠的css,js,favicon等文件,在本例中我们定名模板文件名称为index.tmpl.html,模板源代码如下

!DOCTYPEhtml

htmllang="en"

head

metacharset="utf-8"

titleWebpackSampleProject

/title

/head

body

divid='root'

/div

/body

/html

  3.更新webpack的设置文件,方法同上,新建一个build文件夹用来存放终极的输出文件

  varwebpack=require('webpack');varHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={devtool:'eval-source-map',entry:__dirname+"/app/main.js",output:{path:__dirname+"/build",filename:"bundle.js"},module:{loaders:[{test:/.json$/,loader:"json"},{test:/.js$/,exclude:/node_modules/,loader:'babel'},{test:/.css$/,loader:'style!css?modules!postcss'}]},postcss:[require('autoprefixer')],plugins:[newHtmlWebpackPlugin({template:__dirname+"/app/index.tmpl.html"//new一个这个插件的实例,并传入相干的参数})],devServer:{colors:true,historyApiFallback:true,inline:true}}HotModuleReplacement

webpack构建服务器(webpack起服务) webpack构建服务器(webpack起服务)「webpack搭建本地服务器」 行业资讯

  HotModuleReplacement(HMR)也是webpack里很有效的一个插件,它答应你在修改组件代码后,主动革新及时预览修改后的结果。

  在webpack中实现HMR也很简单,只必要做两项设置

在webpack设置文件中添加HMR插件;

在WebpackDevServer中添加“hot”参数;

webpack构建服务器(webpack起服务) webpack构建服务器(webpack起服务)「webpack搭建本地服务器」 行业资讯

  不外设置完这些后,JS模块着实还是不能主动热加载的,还必要在你的JS模块中实行一个Webpack提供的API才华实现热加载,固然这个API不难利用,但是假如是React模块,利用我们已经认识的Babel可以更方便的实现功能热加载。

  整理下我们的思绪,具体实现方法如下

Babel和webpack是独立的工具

二者可以一起工作

二者都可以通过插件拓展功能

HMR是一个webpack插件,它让你能欣赏器中及时观察模块修改后的结果,但是假如你想让它工作,必要对模块举行额外的配额;

Babel有一个叫做react-transform-hrm的插件,可以在不对React模块举行额外的设置的条件下让HMR正常工作;

  更新我们的例子来实际看看怎样设置

  //webpack中的设置varwebpack=require('webpack');varHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={devtool:'eval-source-map',entry:__dirname+"/app/main.js",output:{path:__dirname+"/build",filename:"bundle.js"},module:{loaders:[{test:/.json$/,loader:"json"},{test:/.js$/,exclude:/node_modules/,loader:'babel'},{test:/.css$/,loader:'style!css?modules!postcss'}]},postcss:[require('autoprefixer')],plugins:[newHtmlWebpackPlugin({template:__dirname+"/app/index.tmpl.html"}),newwebpack.HotModuleReplacementPlugin()//热加载插件],devServer:{colors:true,historyApiFallback:true,inline:true,hot:true}}

  安装react-transform-hmr

  npminstall--save-devbabel-plugin-react-transformreact-transform-hmr

  设置Babel

  {"presets":["react","es2015"],"env":{"development":{"plugins":[["react-transform",{"transforms":[{"transform":"react-transform-hmr","imports":["react"],"locals":["module"]}]}]]}}}

  如今当你利用React时,可以热加载模块了

  产物阶段的构建

  如今为止,我们已经利用webpack构建了一个完备的开辟环境。但是在产物阶段,大概还必要对打包的文件举行额外的处理惩罚,比如说优化,压缩,缓存以及分离CSS和JS。

  对于复杂的项目来说,必要复杂的设置,这时间分解设置文件为多个小的文件可以使得事变井井有条,以上面的例子来说,我们创建一个“webpack.production.config.js”的文件,在内里加上根本的设置,它和原始的webpack.config.js很像,如下

  varwebpack=require('webpack');varHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={entry:__dirname+"/app/main.js",output:{path:__dirname+"/build",filename:"bundle.js"},module:{loaders:[{test:/.json$/,loader:"json"},{test:/.js$/,exclude:/node_modules/,loader:'babel'},{test:/.css$/,loader:'style!css?modules!postcss'}]},postcss:[require('autoprefixer')],plugins:[newHtmlWebpackPlugin({template:__dirname+"/app/index.tmpl.html"}),],}//package.json{"name":"webpack-sample-project","version":"1.0.0","deion":"Samplewebpackproject","s":{"start":"webpack-dev-server--progress","build":"NODE_ENV=productionwebpack--config./webpack.production.config.js--progress"},"author":"CássioZen","license":"ISC","devDependencies":{...},"dependencies":{...}}优化插件

  webpack提供了一些在发布阶段非常有效的优化插件,它们大多来自于webpack社区,可以通过npm安装,通过以下插件可以完成产物发布阶段所需的功能

OccurenceOrderPlugin:为组件分配ID,通过这个插件webpack可以分析和优先思量利用最多的模块,并为它们分配最小的ID

UglifyJsPlugin:压缩JS代码;

ExtractTextPlugin:分离CSS和JS文件

  我们继承用例子来看看怎样添加它们,OccurenceOrder和UglifyJSplugins都是内置插件,你必要做的只是安装它们

  npminstall--save-devextract-text-webpack-plugin

  在设置文件的plugins后引用它们

  varwebpack=require('webpack');varHtmlWebpackPlugin=require('html-webpack-plugin');varExtractTextPlugin=require('extract-text-webpack-plugin');module.exports={entry:__dirname+"/app/main.js",output:{path:__dirname+"/build",filename:"bundle.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:[newHtmlWebpackPlugin({template:__dirname+"/app/index.tmpl.html"}),newwebpack.optimize.OccurenceOrderPlugin(),newwebpack.optimize.UglifyJsPlugin(),newExtractTextPlugin("style.css")]}缓存

  缓存无处不在,利用缓存的最好方法是包管你的文件名和文件内容是匹配的(内容改变,名称相应改变)

  webpack可以把一个哈希值添加到打包的文件名中,利用方法如下,添加特别的字符串肴杂体([name],[id]and[hash])到输出文件名前

  varwebpack=require('webpack');varHtmlWebpackPlugin=require('html-webpack-plugin');varExtractTextPlugin=require('extract-text-webpack-plugin');module.exports={entry:__dirname+"/app/main.js",output:{path:__dirname+"/build",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:[newHtmlWebpackPlugin({template:__dirname+"/app/index.tmpl.html"}),newwebpack.optimize.OccurenceOrderPlugin(),newwebpack.optimize.UglifyJsPlugin(),newExtractTextPlugin("[name]-[hash].css")]}

  如今用户会有公道的缓存了。

  总结

  这是一篇好长的文章,谢谢你的耐烦,能细致看到了这里,大概半个月前我第一次本身一步步设置项目所需的Webpack后就不停想写一篇条记做总结,反复动笔都不能让本身满意,总以为写不清楚。直到看到本文的英文版WebpackforReact,真的有多次豁然开朗的感觉,喜好看原文的点链接就可以看了。着实关于Webpack本文报告得仍不完全,不外信托你看完后已经进入Webpack的大门,可以或许更好的探索别的的关于Webpack的知识了

客户评论

我要评论