注:如下教程均在 windows 环境实现,使用其余操做系统的同窗实践过程可能会有些出入。html
上一章咱们了解了 webpack 的 ES6 编译环境搭建:webpack 项目构建:(二)ES6 编译环境搭建
这一章咱们会结合 webpack 的 webpack-dev-server,介绍本地测试服务器的搭建过程。webpack
上一章咱们在 webpack 上结合了 Babel,搭建了一个可使用 ES6 语法的开发构建平台。(源码下载地址:https://github.com/xh4722/web...)
项目结构以下:
下面咱们将扩展咱们的 webpackDemo,赋予咱们项目本地开发的能力。git
咱们在项目开发过程当中通常须要经历三个环境:开发环境、测试环境和生产环境。程序员
不一样环境的使用场景不一样,对咱们的 webpack 配置要求也会不同。github
咱们先从开发环境入手,一步步搭建一个高效的 webpack 开发环境。web
webpack 有一些特性是专门用于开发环境的,能够帮助咱们搭建一个更好的开发环境。express
先让咱们试用一下自动编译的第一种方式,在 webpackDemo 的目录下执行 webpack --watch:
能够看到在执行了 webpack --watch 命令之后,该命令并不会立刻结束,webpack 启动了一个监听服务。
在浏览器中打开咱们的 index.html 页面,过了一秒弹出 Hello world! 弹窗:npm
如今让咱们修改当前目录的 index.js 文件,将弹窗内的 'Hello world!' 信息修改成 'Hello webpack!' 并保存:json
index.jssegmentfault
控制台信息输出以下:
能够看到 webpack 检测到了入口文件的变动并自动执行了打包工做。
让咱们刷新咱们的页面,能够看到过了一秒弹出 Hello webpack! 弹窗。
webpack --watch 解决了入口文件变动后自动编译的问题,可是每次修改之后都须要手动刷新页面才能看到最新的效果。咱们可使用 webpack-dev-server 解决手动刷新的问题。
webpack-dev-server 提供了一个简单的 web 服务器,并提供了实时加载(live reloading)的功能。在正式使用前咱们先作一些准备工做。
咱们修改了两个地方:(1)将 output.filename 修改成 './dist/test.js';(2)新增 devServer,并配置资源路径为输出文件的位置 './dist';
如今让咱们在当前目录执行服务启动命令:webpack-dev-server
从控制台信息能够看出 webpack-dev-server 启动了一个默认端口号为 8080 的本地服务,咱们能够在浏览器中输入 http://localhost:8080 查看效果:
界面显示 Cannot GET / 找不到文件,这是由于 webpack-dev-server 会默认打开资源目录(./dist)下的 index.html 文件,可是咱们的 webpack.config.js 只配置了 output 输出文件为 './dist/test.js',在 dist 目录下并不存在 index.html 文件。
那么怎么在 dist 目录下生成 index.html 文件呢?咱们可使用 HtmlWebpackPlugin 完成 Html 文件的建立过程:
咱们在 webpack.config.js 中声明了 HtmlWebpackPlugin,并经过 webpack.config.js 的 plugins 引入该插件。
如今让咱们从新启动 webpack-dev-server 并打开浏览器:
服务启动正常。如今咱们修改 index.js 文件的弹窗信息为 'Hello webpack-dev-server!',能够看到控制台中 webpack-dev-server 自动从新编译,编译完成后,页面自动刷新:
如今让咱们稍微休息一下,回顾一下上面 webpack-dev-server 的搭建过程,能够发现几个比较有意思的地方:
让咱们在上面的 webpack-dev-server 基础上作一些优化,让服务器工做得更好:
还可使用 Node.js API 结合 webpack-dev-server 构建服务器。新建一个 server.js 文件,用于编写服务器代码:
server.js
在 server.js 里咱们引入了 webpack-dev-server,并启动了 localhost:8080 服务。
接下来打开咱们的 package.json 文件,修改咱们的启动命令:
package.json
在当前目录执行命令:npm start
服务启动成功后在浏览器中输入 http://localhost:8080 打开网页,代码执行成功:
可是咱们发现有两个问题:
让咱们尝试解决这两个问题:
针对问题1,咱们能够引入 webpack-browser-plugin 实现自动打开浏览器的功能:
第三种启动本地服务的方式是使用 webpack-dev-middleware。webpack-dev-middleware 是 webpack-dev-server 内部使用的一个容器,能够把 webpack 处理后的文件传递给一个服务器。咱们能够经过 express 配合使用 webpack-dev-middleware 来搭建本地服务。
上一节的 express 服务器能够实现自动编译的功能,可是没法自动从新加载界面,排查问题产生的缘由。
Google 查找问题,解释以下:
截图来自:https://blog.cloudboost.io/li...
能够看出来,产生这个问题的缘由是 webpack-dev-server 内置了热加载模块,因此能检测文件变动并自动加载页面;而 webpack-dev-middleware 只是用于处理文件的变动,并不能控制浏览器的从新加载。要实现 express 的热加载功能,就须要用到另一个中间件 webpack-hot-middleware,热更新的具体实现将在下一章进行介绍。