webpack搭建php服务器,【webpack】webpack-dev-server生猛上手——让我们来搭一个webpack的微服务器吧!...

本文详细介绍了如何利用webpack-dev-server搭建本地开发服务器,包括externals的使用、配置属性详解如port、host、historyApiFallback、overlay、stats、quiet、compress等,并演示了hot和inline模式的模块热替换机制。此外,还展示了通过package.json简化启动命令的方法,以及总结了三种配置服务的方式。

[导读][前言]:因为最近在搞百度地图API的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的“收尾工作”——即打包,而没有把它纳入到项目开发的“主体过程”中来,真是“物不尽其用”。于是就有了我今

[前言]:因为最近在搞百度地图API的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的“收尾工作”——即打包,而没有把它纳入到项目开发的“主体过程”中来,真是“物不尽其用”。于是就有了我今天的这篇学习文章:利用webpack-dev-server搭建一个webpack的服务器

参考资料:

webpack-dev-server的github地址:1

官方文档http://webpack.github.io/docs/webpack-dev-server.html(推荐看2的文档)

webpack2官方文档https://webpack.js.org/configuration/dev-server/#devserver(推荐读这个)

提纲:

1.复习webpack的知识

2.详解webpack-dev-server的配置属性

3.webpack-dev-server的自动刷新和模块热替换机制

4.webpack下配置服务器的三种方式

复习一下webpack的知识

我将目录结构简化之后长这样:

3f82155ff6f3c11cecec7f3f0abdd952.png

我的webpack.config.js:var webpack = require('webpack')

var path =require('path')

module.exports = {

entry:{

app:path.join(__dirname,'src','index.js')

},

output:{

filename:'bundle.js',

path:path.join(__dirname,'dist')

}

}

我的src/index.js:require('./a.js')

require('./b.js')

console.log('我是index.js')

我的src/a.js:console.log('我是a.js')

我的src/b.js:console.log('我是b.js')

我的dist/index.html:/*其他部分省略*/

当我们在终端运行“webpack”命令后,目录变为:

28709c1111035cfef5ca43f1a7c220af.png

一张图复习一下webpack的机制:

46d4efb3e27358a58051ea50ce6e5b65.png

OK,下面,让我们开始搭建一个服务器吧:

怎么用最简单的方式搭建一个服务器?

1.你需要一个安装一个模块

在终端中进入项目目录下,敲下npm install webpack-dev-server --save-dev回车

2.在终端运行一段命令:

node_modules/.bin/webpack-dev-server(网上有的说直接输webpack-dev-server那是错的)

成功!输出的是这一段信息:

22ed8b6f99e9d281158d1192ac54f030.png

然后进入默认的localhost:8080页面:

9d28dd80784f1f6c1ece1c49fa1a46c8.png

服务器的根目录就是我们工程的目录

到这里,我们要做的第一步就成功啦!

进入dist后,我们发现报了这样一段错误:

f53e690694ded49ad4068f44fe96938d.png

what"dist")

}

}保存,后打开页面看控制台,报错已经消失了!正确打印了被打包的文件内容:

c4eb6cc981f4980fea2bde906d22801e.png

详解webpack-dev-server的配置属性

webpack-dev-server:当我们在终端运行"node_modules/.bin/webpack-dev-server后:

26758c58158c940a647351623a2fd83e.png

这也就是我在上面的阐述中将bundle.js"放在了"加上双引号的原因

2.devServer.port

port配置属性指定了开启服务的端口号:devServer: {

port:7000

}

设置端口号为7000:

运行:node_modules/.bin/webpack-dev-server

f140ba17a0c7deec5cb16b551718b25f.png

这个时候就不是默认的8080的端口了,而是我们设置的7000

3.devServer.host

host设置的是服务器的主机号:

修改配置为:devServer: {

contentBase: path.join(__dirname, "dist"),

port:7000,

host:'0.0.0.0'

}

此时localhost:7000和0.0.0.0:7000都能访问成功

b80481340f9c3d644dc69acd22adc160.png

4.devServer.historyApiFallback

在文档里面说的很清楚,这个配置属性是用来应对返回404页面时定向到特定页面用的(the index.html page will likely have to be served in place of any 404 responses)

在dist目录下新增一个HTML页面:/*剩下的都是很常规的HTML内容,故省略*/

这里是404界面

我们把webpack.config.js修改如下:module.exports = {

/*这里省略entry和output,参照上面写的内容*/

devServer: {

contentBase: path.join(__dirname, "dist"),

historyApiFallback:{

rewrites:[

{from:/./,to:'/404.html'}

]

}

}

}

打开页面,输入一个不存在的路由地址:

40c2b372648eab313ff5d49a34d14f38.png

5.devServer.overlay

这个配置属性用来在编译出错的时候,在浏览器页面上显示错误,默认是false,可设置为true

首先我们人为制造一个编译错误:在我们尚未配置babel loader的项目里使用ES6写法:

在src/index.js里写入“const a”

在shell里提示编译错误:

acf4caf43a8a123b056ed470bfd7e7ad.png 

但在浏览器里没有提示:

f0a516cae985d95d162f9069310116d4.png所以我们把webpack.config.js修改为:module.exports = {

/*这里省略entry和output,参照上面写的内容*/

devServer: {

contentBase: path.join(__dirname, "dist"),

overlay: true

}

}

再重新运行node_modules/.bin/webpack-dev-server,浏览器上把错误显示出来了

6b9703908130dadb0ee9652090b9678d.png

6.devServer.stats(字符串)

这个配置属性用来控制编译的时候shell上的输出内容,我们没有设置devServer.stats时候编译输出是这样子的:

(其中看起来有许多看似不重要的文件也被打印出来了)

05c0a61f90db2b3e11ebf16b63646763.png

stats: "errors-only"表示只打印错误:

我们把配置改成:devServer: {

contentBase: path.join(__dirname, "dist"),

stats: "errors-only"

}

因为只有错误才被打印,所以,大多数信息都略过了

e9911a75ccc88f990e3f503db2db5b26.png

除此之外还有"minimal","normal","verbose",这里不多加赘述

7.devServer.quiet

当这个配置属性和devServer.stats属于同一类型的配置属性

当它被设置为true的时候,控制台只输出第一次编译的信息,当你保存后再次编译的时候不会输出任何内容,包括错误和警告

来做个对比吧:

quiet:false(默认):

第一次编译:

cbeb99c1f47a41e95092f0157c70042f.png

第二次编译(当你保存的时候)

3aebc46d77a33b37699cd00cfc72070f.png

quiet:true

第一次编译同上

第二次编译什么都不输出

【吐槽】这样看的话感觉这个配置好像只有负面作用呢.....

8.devServer.compress

这是一个布尔型的值,当它被设置为true的时候对所有的服务器资源采用gzip压缩

采用gzip压缩的优点和缺点:

优点:对JS,CSS资源的压缩率很高,可以极大得提高文件传输的速率,从而提升web性能

缺点:服务端要对文件进行压缩,而客户端要进行解压,增加了两边的负载

9.devServer.hot和devServer.inline

在这之前,首先要说一下的是webpack-dev-server的自动刷新和模块热替换机制

webpack-dev-server的自动刷新和模块热替换机制

这两个机制是紧紧联系在一起的

从外部角度看——自动刷新

当我们对业务代码做了一些修改然后保存后(command+s),页面会自动刷新,我们所做的修改会直接同步到页面上,而不需要我们刷新页面,或重新开启服务

(The webpack-dev-server supports multiple modes to automatically refresh the page)

从内部角度看——模块热替换

在热替换(HMR)机制里,不是重载整个页面,HMR程序会只加载被更新的那一部分模块,然后将其注入到运行中的APP中

(In Hot Module Replacement, the bundle is notified that a change happened. Rather than a full page reload, a Hot Module Replacement runtime could then load the updated modules and inject them into a running app.)

webpack-dev-server有两种模式可以实现自动刷新和模块热替换机制

1. Iframe mode(默认,无需配置)

页面被嵌入在一个iframe里面,并且在模块变化的时候重载页面

2.inline mode(需配置)添加到bundle.js中

当刷新页面的时候,一个小型的客户端被添加到webpack.config.js的入口文件中

例如在我们的例子中,在使用inline mode的热替换后,相当于入口文件从entry:{

app:path.join(__dirname,'src','index.js')

}

变成了:entry:{

app:[path.join(__dirname,'src','index.js'),

'webpack-dev-server/client"http://images2015.cnblogs.com/blog/1060770/201706/1060770-20170604190932618-464188592.png" alt="" width="554" height="109">

如果有上面两行输出则表明你已经配置成功

现在还有一个问题,那就是每次直接输入node_modules/.bin/webpack-dev-server来启动服务器对我们来说简直就是莫大的痛苦,那么怎么对这一过程进行简化呢?

答案:把这个运行脚本写到package.json里就行了!

这里我把我的package.json写成:{

"name": "webpackTest2",

"dependencies": {},

"devDependencies": {},

"scripts": {

"start": "node_modules/.bin/webpack-dev-server"

}

}

在终端运行npm start:运行成功!

配置服务的三种方式:

1在webpack.config.js输出对象中的devServer属性中写配置(也就是我们上述所有例子的做法)

2写在package.json中,写在node 命令对应的脚本中,例如我们可以写成:

"scripts": {

"start": "node_modules/.bin/webpack-dev-server --port 8000 --inline true "

}(但这显然并不是一个值得推荐的方式)

3使用纯node的API实现,下面是一个官方给的例子var config = require("./webpack.config.js");

config.entry.app.unshift("webpack-dev-server/client");

var compiler = webpack(config);

var server = new WebpackDevServer(compiler, {

/*我们写入配置的地方*/

});

server.listen(8080);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值