webpack配置之后端渲染详解


Posted in Javascript onOctober 26, 2017

webpack配置之后端渲染2017年, vue, react, angular 已经占据前端的主流, 不得不承认这也是前端的未来发展方向. 但是后端渲染的开发方式仍然很常见, 不管是个人项目还是商业项目, 后端渲染搞起来真是糙猛快. 但是借着前端发展的东风, 后端渲染也有很大的改进空间. 这里就介绍一下我自己的实践经验: 前后端不分离的情况下实现热加载以及一定程度下的前端主导开发. 这里以koa为例, 但是仓库里也有django版. 理论上所有语言都可以实现. 有兴趣可以看下, 仓库地址在文末.

效果图

webpack配置之后端渲染详解

原理

原理说起来还是很简单的:

1、独立启动静态资源服务器打包生成资源列表(manifest)

通过webpack-manifest-plugin插件生成manifest.json文件

new ManifestPlugin({
  writeToFileEmit: true,
  publicPath: 'http://localhost:5000/static/'
})

文件结果如图:

webpack配置之后端渲染详解

服务器读取资源列表加载到模板文件中

app.use(async (ctx, next) => {
 const manifest = await fs.readFile(path.resolve(__dirname, 'assets/bundles/manifest.json'))
 ctx.state = {
  static: JSON.parse(manifest.toString())
 }
 await next()
})

这个中间件通过读去manifest.json将资源列表挂载到ctx.state(模板变量)中, 之后就可以直接在模板中引用静态资变量了

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>{{ title }}</title>
 <link rel="stylesheet" href="{{static['test.css']}}" rel="external nofollow" >
</head>
<body>
 <h1>Hello, World</h1>
 
 <script src="{{static['test.js']}}"></script>
</body>
</html>

需要注意的是由于后端渲染的一般是多入口, 所以只需要在对应的模板中引入需要的入口文件.

热加载

热加载其实也有很多解决方案: browsersync, live reload 等等, 但是这些都是full reload 只是减少了f5的频率, webpack的热加载就方便很多了通过websocket(具体我也不清楚), 配置起来也很简单.

在入口文件中加上

hot: 'webpack/hot/only-dev-server',
devServerClient: 'webpack-dev-server/client?http://0.0.0.0:5000'

/**
完整版
entry: {
  index: './assets/index.js',
  test: './assets/test.js',
  hot: 'webpack/hot/only-dev-server',
  devServerClient: 'webpack-dev-server/client?http://0.0.0.0:5000'
},
*/

插件中加上: new webpack.HotModuleReplacementPlugin()

需要注意的有两点:

  1. extract-text-webpack-plugin 加上之后就无法hot reload, 开发配置不要加上这个插件
  2. 根据webpack的文档, 每个入口文件都需要加上下面一段代码才能实现 js的hot reload
if (module.hot) {
 module.hot.accept()
}

完整配置和代码这里就不贴了, 仓库地址(django部分代码在master分支): https://github.com/xiadd/wepack-mutipage

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
FireFox中textNode分片的问题
Apr 10 Javascript
js GridView 实现自动计算操作代码
Mar 25 Javascript
kmock javascript 单元测试代码
Feb 06 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 Javascript
前端插件之Bootstrap Dual Listbox使用教程
Jul 23 Javascript
简单了解JS打开url的方法
Feb 21 Javascript
Vue使用v-viewer实现图片预览
Oct 21 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 #jQuery
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 #Javascript
node文字生成图片的示例代码
Oct 26 #Javascript
vue-cli中打包图片路径错误的解决方法
Oct 26 #Javascript
javascript+html5+css3自定义弹出窗口效果
Oct 26 #Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 #Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 #Javascript
You might like
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
lib.utf.js
2007/08/21 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
jquery中为什么能用$操作
2019/06/18 jQuery
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python批量导出导入MySQL用户的方法
2013/11/15 Python
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
用pycharm开发django项目示例代码
2018/10/24 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
介绍一下Java的安全机制
2012/06/28 面试题
函数指针的定义是什么
2016/08/14 面试题
旅行社各个岗位职责
2014/03/15 职场文书
婚前协议书范本
2014/10/27 职场文书
长城导游词400字
2015/01/30 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书