这里的主要变化是从node app改为supervisor -i client app。其中-i等于--ignore,这里表示忽略client,显然,我们可不希望在改前端代码的时候服务器也重启。
这里的cross-env也是一个npm组件,它可以处理windows和其他Unix系统在设置环境变量的写法上不一致的问题。
把会重启的服务器和浏览器关联起来
把Express启动文件最后的部分做这样的修改:
var reload = require('reload'); var http = require('http'); var server = http.createServer(app); reload(server, app); server.listen(3000, function(){ console.log('App (dev) is now running on port 3000!'); });
Express启动文件的最后一般是app.listen()。参照reload的说明,需要这样用http再增加一层服务。
然后,再到Express的视图文件views里,在底部增加一个<script>:
<% if (env !== "production") { %> <script src="https://www.jb51.net/reload/reload.js"></script> <% } %>
所有的views都需要这样一段代码,因此最好借助模板引擎用include或extends的方式添加到公共位置。
这里的reload.js和前面webpack的开发环境bundle.js并不冲突,它们一个负责前端源文件变更后进行编译和刷新,另一个负责在服务器发生重启时触发延时刷新。
到此,server也完成了。现在,修改项目内的任意源文件,按下ctrl + s,浏览器里的页面都会对应地做一次“适当”的刷新。
完整示例
完整示例已经提交到github:express-webpack-full-live-reload-example
效果如下:
附加的可选方案
前面说的server部分,分为views和routes,如果只修改views,那么服务器并不需要重启,直接刷新浏览器就可以了。
针对这样的开发情景,可以把views文件的修改刷新变得更快。这时候我们不用reload和supervisor,改为用browsersync,在Express的启动文件内做如下修改:
var bs = require('browser-sync').create(); app.listen(3000, function(){ bs.init({ open: false, ui: false, notify: false, proxy: 'localhost:3000', files: ['./server/views/**'], port: 8080 }); console.log('App (dev) is going to be running on port 8080 (by browsersync).'); });
然后,使用browsersync提供的新的访问地址就可以了。这样,修改views(html)的时候,由browsersync帮忙直接刷新,修改css和javascript的时候继续由webpack的middleware来执行编译和刷新。
结语
有了webpack后,没有自动刷新怎么干活?
说起来,能做出像这样的全栈刷新,大概也是得益于Express和Webpack都是javascript,可以很容易地结合、协作的缘故吧。