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 相关文章推荐
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
jquery animate 动画效果使用说明
Nov 04 Javascript
JS动态创建元素的两种方法
Apr 20 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
Oct 01 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
Sep 18 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 Javascript
微信小程序时间轴实现方法示例
Jan 14 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
vue elementUI批量上传文件
Apr 26 Vue.js
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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
各种快递查询--Api接口
2016/04/26 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
jquery 事件执行检测代码
2009/12/09 Javascript
javascript打印输出json实例
2013/11/11 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
QML使用Python的函数过程解析
2019/09/26 Python
Python如何省略括号方法详解
2020/03/21 Python
用python写爬虫简单吗
2020/07/28 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
SQL数据库笔试题
2016/03/08 面试题
巧克力蛋糕店创业计划书
2014/01/14 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
陈欧的广告词
2014/03/18 职场文书
捐助感谢信
2015/01/22 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
主婚人致辞精选
2015/07/28 职场文书
分家协议书范本
2016/03/22 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python