使用webpack-dev-server来监听项目变化
webpack的出现方便了前端开发者,使开发和部署分成了两部分,开发者可以正常根据工程化的要求进行开发,部署时通过webpack实现代码的裁剪和优化。
本次就介绍一个webpack的功能 webpack-dev-server
将webpack与提供实时重载的开发服务器一起使用。这仅应用于开发。
它在后台使用了webpack-dev-middleware,它提供了对Webpack资产的快速内存访问。
webpack-dev-server提供了一个小型的express的http服务器,这个http服务器和client使用了websocket通讯协议,原始文件作出改动后,webpack-dev-server会实时的编译,但是最后的编译的文件并没有输出到目标文件夹。
注意:启动webpack-dev-server后,在目标文件夹中是看不到编译后的文件的,编译后的文件都保存到了内存当中来加速访问。
启用webpack-dev-server
1 |
|
在webpack.config.js中添加devServer对象:
1 |
|
然后通过npx webpack-dev-server
启动,终端上会输出一些信息,一般我们会增加一些参数来使输出更加好看:
1 |
|
上面的命令增加一个开发工具 eval-source-map
,开启了progress进度显示,开启了colors颜色,hot热更新和inline更新模式。上面的参数也可以添加到devServer的属性中。
终端输出的内容如下:
1 |
|
我们就可以通过localhost:9000来访问我们的应用了。
需要注意的是,由于我们经常把内容输出到dist目录,但是webpack运行是在项目目录的,访问webpack生成在dist目录的main.js时,需要写上相对于webpack的目录,例如dist/main.js。否则会找不到文件。
如果遇到问题,导航到 /webpack-dev-server 路径,可以显示出文件的服务位置。 例如,http://localhost:9000/webpack-dev-server。
配置webpack
webpack-dev-server支持在服务内部调用中间件对数据进行处理。
devServer.before
function (app, server)
在服务内部的所有其他中间件之前, 提供执行自定义中间件的功能。 这可以用来配置自定义处理程序,例如:
1 |
|
devServer.after
同devServer.before,在服务内部的所有中间件之后,提供执行自定义中间件的功能。
devServer.allowedHosts
允许添加白名单服务,允许一些开发服务器访问。
1 |
|
模仿 django 的 ALLOWED_HOSTS,以 . 开头的值可以用作子域通配符。.host.com 将会匹配 host.com, www.host.com 和 host.com 的任何其他子域名。
1 |
|
devServer.clientLogLevel
string: 'none' | 'info' | 'error' | 'warning'
当使用内联模式(inline mode)时,会在开发工具(DevTools)的控制台(console)显示消息,例如:在重新加载之前,在一个错误之前,或者 模块热替换(Hot Module Replacement) 启用时。默认值是 info。
devServer.clientLogLevel 可能会显得很繁琐,你可以通过将其设置为 ‘none’ 来关闭 log。
1 |
|
devServer.color - 只用于命令行工具(CLI)
只在终端下启用,启用/禁用控制台的彩色输出。
1 |
|
devServer.compress
boolean
一切服务都开启gzip压缩。
1 |
|
devServer.contentBase
boolean: false string [string] number
告诉服务器从哪个目录中提供内容。只有在你想要提供静态文件时才需要。devServer.publicPath 将用于确定应该从哪里提供 bundle,并且此选项优先。
默认情况下,将使用当前工作目录作为提供内容的目录。将其设置为 false 以禁用 contentBase。
1 |
|
也可以从多个目录提供内容:
1 |
|
devServer.disableHostCheck
boolean
设置为 true 时,此选项绕过主机检查。不建议这样做,因为不检查主机的应用程序容易受到 DNS 重新连接攻击。
1 |
|
devServer.filename
string
在 lazy mode(惰性模式) 中,此选项可减少编译。 默认在 lazy mode(惰性模式),每个请求结果都会产生全新的编译。使用 filename,可以只在某个文件被请求时编译。
如果 output.filename 设置为 ‘bundle.js’ ,devServer.filename 用法如下:
1 |
|
现在只有在请求了bundle.js时,才会去编译bundle。
总结
webpack的功能确实很强大,可以针对代码进行各种操作,最终生成出可以适应各种场景的代码,使开发和部署彻底分离开来,开发者可以更加专注项目。