当前位置:首页 » 网页前端 » 前端代码修改需要发版热更吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

前端代码修改需要发版热更吗

发布时间: 2022-09-21 01:50:49

1. 用通俗的语言解释冷更新和热更新。

热更新是指软件不通过运营商店的软件版本更新审核,直接通过应用自行下载的软件数据更新的行为。简单来说,就是在用户下载安装APP之后,打开App时遇到的即时更新。热更新是一种各大手游等众多App常用的更新方式。

冷更新差不多就是重装的意思,用户主动从网络、存储介质(光驱、u盘等)来获取安装包,进行安装的过程。而热更新,是程序自主从安装渠道(一般是网络)进行更新升级的过程。

工作原理

热更新就是动态下发代码,它可以使开发者在不发布新版本的情况下,修复 BUG 和发布功能,让开发者得以绕开苹果的审核机制,避免长时间的审核等待以及多次被拒造成的成本。

技术特点

在iOS中有两种App更新方式:一种是在AppStore内进行更新,更新时重新下载全部安装包;另一种就是热更新,用户只有在打开App时才会发现热更新包,更新时只需下载安装更新部分的代码,再次打开时即可。热更新最大的优点就是快,它可以绕过苹果方面的审核,更新通常只需一个晚上即可上线,另一大优点就是更新包较小,一般都在1M左右,用户不连接WiFi也可随意下载。

2. vue插件怎么修改store状态

vue有自己的脚手架构建工具vue-cli,使用起来非常方便,使用webpack来集成各种开发便捷工具,比如:
代码热更新,修改代码之后网页无刷新改变,对前端开发来说非常的方便
PostCss,再也不用去管兼容性的问题了,只针对chrome写css代码,会自动编译生成支持多款浏览器的css代码
Eslint,统一代码风格,规避低级错误,对于有代码洁癖的人来说是绝对的好东西,不过有些地方的代码校验有时候也挺麻烦的-.-
bable,ES2015出来已经有一段时间了,但是不少浏览器还没有兼容ES6.有了bable,放心使用ES6语法,它会自动转义成ES5语法。
Stylus,类似于SASS/SCSS,但是可以不写{}和“:”,使用起来还是很方便的

除此之外,vue-cli已经使用node配置了一套本地服务器和安装命令等,本地运行和打包只需要一个命令就可以搞定,非常的方便
开发
vue非常好的融合了react的组件化思想和angular的指令思想。 一个vue的组件将HTML、CSS、JS代码写在一个文件里面,这样既方便编写,也方便管理和修改
Axios
在vue1.x的时候,vue的官方HTTP请求工具是vue-resource,但是在vue2.0的时候将工具改成了axios。
使用方式都差不多,但需要注意的是:接口返回的res并不直接是返回的数据,而是经过axios本身处理过的json对象。真正的数据在res.data里:
axios.get(url).then((res)=>{
this.data = res.data
})
Vuex
vue提供了一个数据管理工具vuex,有点类似于angular中factory和service,可以进行数据上的通信。 比如存储一些公共变量或者是不同组件间的数据处理等。
这个有一些高级用法在这里不细说,想要了解的可以去官方文档看,有中文版本。
复制代码
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++
}
}
})
axios.get(url).then((res)=>{
this.data = res.data
})
复制代码
Vue-Router
vue-router是vue的路由系统,可以用来创建单页应用。基本思想是在主页面中引入标签,然后定义路由,把router挂在到app上,然后把各个子页面渲染到view里面。使用起来还是很方便的, 跳转页面只需要
router.push('test')
获取元素节点
vue2.0废除了v-el指令,所有的节点指令修改为ref,然后通过ref来获取元素节点,如
<div ref="testHook">test</div> js code this.$ref.testHook
组件间的通信
一。如果是和子组件通信,则使用ref就可以实现,如:
<test ref="testHook"></test>
js code
this.$ref.testHook.add() //调用test子组件的add方法
二。使用emit来发送广播
vue2提供了一套广播机制,即一边发送广播,一边接收广播来执行相应操作。使用方法如下:
比如想要给test组件发送一个“相加”广播:
复制代码
export default {
method:{
click(){
Vue.$emit('add',{}) //第二个参数可作为传递数据传送到监听端口,不需要则传空对象
}
}
}
复制代码
那么test组件中就需要监听,在created方法里写
复制代码
export default {
created(){
Vue.$on('add',this.add)
},
method:{
add(){
this.count++
}
}
}

3. 什么是热更新热更新是什么意思

热更新是一种各大手游等众多App常用的更新方式。

热更新就是动态下发代码,它可以使开发者在不发布新版本的情况下,修复 BUG 和发布功能,让开发者得以绕开苹果的审核机制,避免长时间的审核等待以及多次被拒造成的成本。

2017年6月,AppStore审核团队针对AppStore中热更新的App开发者发送邮件,要求移除所有相关的代码、框架或SDK,并重新提交审核,否则就会在AppStore中下架该软件。

(3)前端代码修改需要发版热更吗扩展阅读:

在iOS中有两种App更新方式:一种是在AppStore内进行更新,更新时重新下载全部安装包;另一种就是热更新。

用户只有在打开App时才会发现热更新包,更新时只需下载安装更新部分的代码,再次打开时即可。

热更新最大的优点就是快,它可以绕过苹果方面的审核,更新通常只需一个晚上即可上线,另一大优点就是更新包较小,一般都在1M左右,用户不连接WiFi也可随意下载。

4. 最近在服务器端修改了网站代码更新之后,用域名浏览发现还是之前的内容,在服务器上查看内容是修改了的。

有的服务器是有CDN加速带缓存的。需要让CDN进行清理。
检查一下代码文件,是否修改了另外一个同名称的同内容的文件。
有的网站前台是带缓存的。比如html,需要重新生成html。动态页面,有时候也需要在后台清理缓存。
浏览器的问题,可以试试其它电脑的浏览器。或自带的IE浏览器。360极速浏览器。
针对以上四点去处理。基本不会出现你这种情况。

5. 地址库变化 怎么更新前端编码文件

这个是组内一位同学在平时开发中,发现调试不便,为团队开发的热更新工具。很厉害,文章中的技术实现内容也是我了解了他的具体实现思路后,整理出来的。
工具源码 EHU(esl-hot-update)
热更新是什么
热更新就是当你在开发环境修改代码后,不用刷新整个页面即可看到修改后的效果。
如果你的项目中使用了webpack的话,你会很幸运,借助webpack-dev-server插件可以实现项目的热更新。
解决的问题
对于大型的系统级别项目会有下面几个特点
模块化(AMD)模式的广泛使用后,开发环境散文件特别多,很容易上百,一不小心还能上千
初始化的内容特别多,各种底层库,ui库等等
这两个特点直接导致每次调试后,刷新会很慢。如果初始化的js达到上千的数量级,每一次重新刷新都是5s,10s,甚至20s的等待。
而热更新的目的就是为了在一定程度上减少这5s,10s,甚20s的浪费。
遇到的问题
我们使用的是网络自己的开发环境工具edp,首先他不支持热更新
我们使用的AMD实践也是网络自己的esl,而且即使是requirejs也暂时没有找到对应的热更新策略,假如requirejs有对应的,我们也无法直接使用
所以最终的结论是我们自己去实现一个基于我们自己业务的。这样我们考虑的面不用太广,并且解决方案的更有针对性,即面向我们现有的业务框架。最重要的是可以尝试修改底层框架做配合。
等待路踩通了,我们再去考虑普适性。
解决的思路
从ehu/package.json 这个文件中,我们就可以看出一些具体的思路
需要一个watch功能,即能够监听到文件的修改
socket.io通知浏览器处理文件的改变
修改esl这个文件,达到能够实时更新的效果
当时最简单的考虑,就是文件改变了后,能够通知浏览器,浏览器去重新load这个文件并且执行一次。这个时候再重新去打开这个模块或者功能后,会发现新load的代码在执行后会覆盖上一次的。
所以当时的我的第一直觉是,esl重复require时,如果后面一次会覆盖前面的,那么可以通过简单的覆盖思路去尝试,结果发现覆盖不了。经过验证,发现是esl内部维护了一个map,即require过的模块会存起来。我们如果希望更新这个模块,只能将map中的对应模块名删除。(后面会详细讲述esl的改造)
对于工具的要求
对应这个工具,我当时也提出了几个要求
esl必然是需要修改的,但是如何对开发人员透明?首先是不能让大家都做这种修改。
页面中也必须加入socket.io支持,那么我们如何在不影响其他人员开发的情况下加入?
我们做的属于beta版本,如何选择性的使用?ehu工具和以前的开发模式随意切换?
安装方便,能否只是作为一个工具,即插即用,不需要繁琐的配置?
如何使用
npm install -g ehu(mac下需要sudo,windows下需要管理员权限)
在原来执行edp webserver start命令的路径 执行 ehu(不再需要执行 edp webserver start)
原来端口号8848修改为8844(原8848依旧可以使用,但不支持热更新)
首先使用的方式很简单,为此特意将工具打包到npm上,以后就算有升级,仅仅需要大家update即可。
另外从使用角度,也尽量集成化(一句命令行即可),避免为了这个工具的使用而做太多额外的事情。
依赖的框架 "dependencies": { "async": "^1.5.0", "commander": "^2.9.0", "express": "^4.13.3", "express-http-proxy": "^0.6.0", "lodash": "^3.10.1", "socket.io": "^1.3.7", "watch": "^0.16.0" }
几个必要的
watch ——监听文件变化
socket.io ——和浏览器的实时通讯
express ——搭建一个服务
express-http-proxy ——代理
commander ——便于自己写node命令
工具类:
async 和 lodash
框架的思想
先看看昨天对于这个工具提出的几个要求
esl必然是需要修改的,但是如何对开发人员透明?首先是不能让大家都做这种修改。
页面中也必须加入socket.io支持,那么我们如何在不影响其他人员开发的情况下加入?
我们做的属于beta版本,如何选择性的使用?ehu工具和以前的开发模式随意切换?
安装方便,能否只是作为一个工具,即插即用,不需要繁琐的配置?
对于1和2,我们其实是需要修改/添加一些代码的,但是代码都不希望提交到项目的开发环境,因为这些代码生成环境完全不需要。
所以我们的解决方案是:拦截,改写(偷梁换柱)
举个例子,当我们需要对esl做一些改造时,我们处理方式是当路由指向esl.js时,我们换成另外一个esl-ehu.js(esl-ehu.js是对esl.js改造后的)返回去,这样就对开发环境的代码透明了。
socket.io的支持也是同理,我们可以在返回html时,改写html的代码,加入对于socket.io的引入。
上面的思路其实来源于之前项目构建打包。
对于3,我们希望在使用工具时,任然能很快切换到以前模式,这样做兼容的目的是希望工具更有竞争力,能吸引大家使用。
我们的解决方案是:内部实现一个子线程,端口号依然是以前的,而且访问这个端口,就绕过了这个工具。
对于子线程child_process,我们还遇到一个问题,就是子线程跑系统的时候,经常挂掉,今天刚刚找到一个解决方案,后面会单开一个文章讲这个坑。
对于4,其实就是使用npm方式
技术细节
第一步:搭建一个新服务作为底层,去托管住我们现在edp服务,新服务上有一个路由配置,对于我们需要处理的,拦截。对于不用处理的直接代理给edp
代码参考
var mid = express(); mid.all('*', httpProxy(config.defaultServer, { // 先走特殊规则,否则就代理到默认web server filter: function(req, res) { return !ruleRoute(req, res); }, forwardPath: function(req, res) { return URL.parse(req.url).path; } })); // 由express-http-proxy托管路由 app.use('/', mid);
ruleRoute 就是一些拦截处理
在此之前,启动下子进程
var child = require('child_process'); var cli = child.exec(defaultServerCLI); cli.stdout.on('data', function (log) { !isServerStarted && (cb(null, log)); isServerStarted && console.log(log); });
此处有坑,后面单开文章描述
第二步: 因为上面拦截后的返回的文件已经支持socket.io,esl等底层已经修改了,所以下面是需要去监听文件通知浏览器做对应处理。
// 启动socket.io服务 io = require('socket.io')(server); io.on('connection', function (socket) { socket.emit('hello'); }); // 监视文件改动 initWatch();
第三步: 做一些集成工作
program .version('0.0.6') .usage('[options]') .option('-p, --port <n>', 'Set the port', setPort) .option('-n, --noServerCLI', '...', noServerCLI) .parse(process.argv);
集成到node命令中
第四步: 默认配置
mole.exports = { // 默认的服务器 defaultServer: 'http://127.0.0.1:8848', // 默认的服务器启动命令 defaultServerCLI: 'edp webserver start', // 从服务器根目录到需要监控的文件夹中间path baseDir: 'nirvana-workspace', // hot update 需要watch的文件夹(不包括baseDir) watchDirs: 'src', // 入口文件(不包括baseDir) indexHTML: 'main.html', // ehu启动端口号(不可与默认的服务器端口号冲突) port: 8844 };
源码中有很多逻辑是处理配置的
浏览器依赖
socket.io ——浏览器端仅仅依赖socket这个去和服务端通信
通信逻辑
// 建立连接 socket.on('hello', function () { log(getLogMsgPrefix(), 'HotUpdate已启动!'); }); // 检测到文件改动 socket.on('hotUpdate', function (file) { // log(getLogMsgPrefix(), '检测到文件改动', file); // ....处理文件修改后对应热更新逻辑 }); 对css/less更新的处理
这个原理比较简单,页面监听到样式的修改,重新加载一次样式即可,简单的覆盖。
但是存在一个潜在问题,因为样式是简单的覆盖,所以,如果修改是删除了样式,是无法生效的。
举例:修改前:
display: none; overflow: hidden; position: relative; background: #FFFFFF; border: 1px solid #E8E8E8; margin-top: 20px;
修改后:
display: none; overflow: hidden; position: relative; background: #FFFFFF;
删除的 border 和 margin-top 其实是没有生效的
这个也是后期需要解决的一个问题。
对模板更新的处理
目前项目中使用的是tpl的模板引擎。
现在就遇到一个问题,在热更新时,模板引擎其实是重复加载模板的,那么就涉及到重复加载是否后面的会覆盖前面问题。
查看加载模板的源码后,发现根据配置有三个选择, 覆盖 , 忽略 和 报错 , 我们业务中使用的配置是遇到重复后会报错处理,所以我们需要在不修改业务默认属性的情况下,添加一些逻辑。
// [esl-hot-update] 重新加载需要覆盖 window.EHU_HOT_UPDATE_OPTIONS && window.EHU_HOT_UPDATE_OPTIONS.etpl.isOverride && (namingConflict = 'override'); switch (namingConflict) { /* jshint ignore:start */ case 'override': engine.targets[name] = target; context.targets.push(name); case 'ignore': break; /* jshint ignore:end */ default: throw new Error('Target exists: ' + name); }
window.EHU_HOT_UPDATE_OPTIONS.etpl.isOverride 这个是修改后自己实现的控制配置修改的逻辑。
然后这个文件加入到服务端的路由中,请求时替换。
对js更新的处理
这里逻辑比较复杂,因为需要修改底层的AMD模块加载的逻辑。
js没有模板那么简单,不是直接覆盖,因为在AMD模式中,每一个文件,都是被上一个文件调用执行的结果。
所以我们处理的逻辑是不仅需要重新加载修改的文件,并且递归所有直接或者间接调用他的文件,全部重新加载。
所以从上面的特点可以看出,这个工具目前阶段主要适用于业务模块的开发,因为业务的依赖不会特别深,对于dep中的核心文件修改,就不是很合适,一旦文件比较底层,热跟新是重新加载的模块也会非常多。
另外也有很多其他的坑,还在不断优化中。
总结
这次实践其实就是业务中遇到的问题(系统太庞大,调试太麻烦),如何解决问题,如何把解决的思路变成一个解决方案,分享给团队。
因为自己解决了,和形成一个解决方案还是有非常大的差别的,例如我们在形成方案的过程中,就尝试了很多新东西,踩了很多坑。
目前还有个坑就是chrome浏览器,调试的Source资源时,如果一个资源重复加载,内存中会更新,但是对应的资源没有更新,导致断点时,映射不对(断点失效),目前暂时的解决方案是,每次请求时添加时间戳,让Source映射的资源强制更新。这个可以正常断点,但是断点没有记忆功能(坑啊,因为文件变了)。

6. 前后端分离方案以及技术选型

作者:关开发

一.什么是前后端分离?

理解前后端分离大概可以从3个方面理解:

1. 交互形式

2. 代码组织形式

3. 开发模式与流程

1.1 交互形式

前后端不分离

后端将数据和页面组装、渲染好了之后,向浏览器输出最终的html;浏览器接收到后会解析html,解析引入的css、执行js脚本,完成最终的页面展示。

前后端分离

后端只需要和前端约定好接收以及返回的数据格式(一般用JSON格式),向前端提供API接口。前端就可以通过HTTP请求调用API的方式进行交互。前端获取到数据后,进行页面组装、渲染,最终在浏览器呈现。

1.2 代码组织形式

前后端不分离

在web应用早期的时候,前端页面以及后台业务数据处理的代码都放在一个工程下,甚至放在同一目录下,前端页面夹杂着后端代码。前、后端开发工程师都需要把整套代码导入开发工具才能开发。此阶段下前后端代码以及工作耦合度太高,前端不能独立开发和测试,后端人员也要依赖前端完成页面后才能完成开发。最糟糕的情况是前端工程师需要会后端模板技术(jsp),后端工程师还要会点前端技术,需要口头说明页面数据接口,才能配合完成开发。否则前端只能当一个“切图仔”,只输出HTML、CSS、以及很少量与业务逻辑无关的js;然后由后端转化为后端jsp,并且还要写业务的js代码。

前后端分离

前后端代码放在不同的工程下,前端代码可以独立开发,通过mock/easy-mock技术模拟后端API服务可以独立运行、测试;后端代码也可以独立开发,运行、测试,通过swagger技术能自动生成API文档供前端阅读,还可以进行自动化接口测试,保证API的可用性,降低集成风险。

1.3 开发模式与流程

前后端不分离

在项目开发阶段,前端根据原型和UI设计稿,编写HTML、CSS以及少量与业务无关的js(纯效果那些),完成后交给后台人员,后台人员将HTML转为jsp,并通过JSP的模板语法进行数据绑定以及一些逻辑操作。后台完成后,将全部代码打包,包含前端代码、后端代码打成一个war,然后部署到同一台服务器运行。顶多做一下动静分离,也就是把图片、css、js分开部署到nginx。

具体开发流程如下:图略

前后端分离

实现前后端分离之后,前端根据原型和UI设计稿编写HTML、CSS以及少量与业务无关的js(纯效果那些),后端也同时根据原型进行API设计,并与前端协定API数据规范。等到后台API完成,或仅仅是API数据规范设定完成之后。前端即可通过HTTP调用API,或通过mock数据完成数据组装以及业务逻辑编写。前后端可以并行,或者前端先行于后端开发了。

具体开发流程如下:图略

二、前后端分离的好处与坏处。

从上面3个方面对比了之后,前后端分离架构和传统的web架构相比,有很大的变化,看起来好处多多。到底是分还是不分,我们还是要理性分析是否值得才去做。

从目前应用软件开发的发展趋势来看,主要有两方面需要注意:

· 越来越注重用户体验,随着互联网的发展,开始多终端化。

· 大型应用架构模式正在向云化、微服务化发展。

我们主要通过前后端分离架构,为我们带来以下四个方面的提升:

· 为优质产品打造精益团队

通过将开发团队前后端分离化,让前后端工程师只需要专注于前端或后端的开发工作,是的前后端工程师实现自治,培养其独特的技术特性,然后构建出一个全栈式的精益开发团队。

· 提升开发效率

前后端分离以后,可以实现前后端代码的解耦,只要前后端沟通约定好应用所需接口以及接口参数,便可以开始并行开发,无需等待对方的开发工作结束。与此同时,即使需求发生变更,只要接口与数据格式不变,后端开发人员就不需要修改代码,只要前端进行变动即可。如此一来整个应用的开发效率必然会有质的提升。

· 完美应对复杂多变的前端需求

如果开发团队能完成前后端分离的转型,打造优秀的前后端团队,开发独立化,让开发人员做到专注专精,开发能力必然会有所提升,能够完美应对各种复杂多变的前端需求。

· 增强代码可维护性

前后端分离后,应用的代码不再是前后端混合,只有在运行期才会有调用依赖关系。应用代码将会变得整洁清晰,不论是代码阅读还是代码维护都会比以前轻松。

那么前后端分离有什么不好的地方吗?我目前是没有想到,除非你说会增加前端团队的配备,后端工程师会变的不全能。。。

二、前后端分离架构方案。

实现前后端分离,主要是前端的技术架构变化较大,后端主要变为restfull 风格API,然后加上Swagger技术自动生成在线接口文档就差不多了。

对于目前用于前后端分离方案的前端技术架构主要有两种:

· 传统SPA

· 服务端渲染SSR

2.1 传统SPA

传统SPA指的是单页面应用,也就是整个网站只有一个页面,所有功能都通过这一个页面来呈现。因为一个人的肉眼,某一个时间点看一个页面,既然如此何必要不同功能做多个页面呢?只保留一个页面作为模板,然后通过路由跳转来更新这个模板页面的内容不就可以了吗?确实如此,现在通过reac全家桶、tvue全家桶,模块化、路由、wabpack等技术轻而易举就能实现一个单页面应用。

单页面应用的运行流程

1.用户通过浏览器访问网站url

2.单页面的html文件(index.html)被下载到浏览器,接着下载html里面引用的css,js。

3.css,js下载到浏览器完成之后,浏览器开始解析执行js向后端服务异步请求数据。

4.请求数据完成后,进行数据绑定、渲染,最终在用户浏览器呈现完整的页面。

2.2 服务端渲染

服务端渲染的方案指的是数据绑定,渲染等工作都放在服务端完成,服务端向浏览器输出最终的html。大家看完这个是不是有个疑问,这不是又回到了前后端不分离的时代了吗?答案是否定的,因为这里的服务端是用来执行前端数据绑定、渲染的,也就是把浏览器的一部分工作分担到了服务端。而目前具备这只种能力的服务端是NodeJs服务端。

它的原理其实就是在浏览器与前端代码中间插入了一个NodeJs服务端。浏览器请求前端页面时,会先经过NodeJS服务端,由NodeJs去读取前端页面,并执行异步后端API,获取到数据后进行页面数据绑定,渲染等工作,完成一个最终的html然后返回浏览器,最后浏览器进行展示。

服务端渲染应用的运行流程:

1.用户通过浏览器访问网站url

2.NodeJS服务端接收到请求,读取到对应的前端html,css,js。

3.NodeJS解析执行js向后端API异步请求数据。

4.NodeJs请求数据完成之后,进行数据绑定、渲染,得到一个最终的html。

5.NodeJs向浏览器输出html,浏览器进行展示。

PS:其实本质就是把前端编写成一个nodeJs的服务端web应用。实施服务端渲染后,我们最终运行的是一个Nodejs服务端应用。而单页面应用是把静态页面部署到静态资源服务器进行运行。

看到这里,你是否又有疑问,为什么要这么麻烦搞服务端渲染呢?

2.3 SPA与服务端渲染方案对比

SPA的优点是开发简单,部署简单;缺点是首次加载较慢,需要较好的网络,不友好的SEO。

so,以下就是使用服务端渲染的理由了(摘取vue官方说法):

与传统 SPA (单页应用程序 (Single-Page Application)) 相比,服务器端渲染 (SSR) 的优势主要在于:

· 更好的 SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。

请注意,截至目前,Google 和 Bing 可以很好对同步 JavaScript 应用程序进行索引。在这里,同步是关键。如果你的应用程序初始展示 loading 菊花图,然后通过 Ajax 获取内容,抓取工具并不会等待异步完成后再行抓取页面内容。也就是说,如果 SEO 对你的站点至关重要,而你的页面又是异步获取内容,则你可能需要服务器端渲染(SSR)解决此问题。

· 更快的内容到达时间 (time-to-content),特别是对于缓慢的网络情况或运行缓慢的设备。

无需等待所有的 JavaScript 都完成下载并执行,才显示服务器渲染的标记,所以你的用户将会更快速地看到完整渲染的页面。通常可以产生更好的用户体验,并且对于那些“内容到达时间(time-to-content) 与转化率直接相关”的应用程序而言,服务器端渲染 (SSR) 至关重要。

使用服务器端渲染 (SSR) 时还需要有一些权衡之处:

· 开发条件所限。浏览器特定的代码,只能在某些生命周期钩子函数 (lifecycle hook) 中使用;一些外部扩展库 (external library) 可能需要特殊处理,才能在服务器渲染应用程序中运行。

· 涉及构建设置和部署的更多要求。与可以部署在任何静态文件服务器上的完全静态单页面应用程序 (SPA) 不同,服务器渲染应用程序,需要处于 Node.js server 运行环境。

· 更多的服务器端负载。在 Node.js 中渲染完整的应用程序,显然会比仅仅提供静态文件的 server 更加大量占用 CPU 资源 (CPU-intensive - CPU 密集),因此如果你预料在高流量环境 (high traffic) 下使用,请准备相应的服务器负载,并明智地采用缓存策略。

以vue为例,实施服务端渲染可以查看官方指南: https://ssr.vuejs.org ,或选择Nuxt.js

2.4 预渲染技术

如果你调研服务器端渲染 (SSR) 只是用来改善少数营销页面(例如 /, /about, /contact 等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。

如果你使用 webpack,你可以使用 prerender-spa-plugin 轻松地添加预渲染。它已经被 Vue 应用程序广泛测试 - 事实上,作者是 Vue 核心团队的成员。

prerender-spa-plugin: https://github.com/chrisvfritz/prerender-spa-plugin

三、前后端分离技术选型

- artTemplate + bootstrap(不推荐, 不算完全前后端分离)

- vue全家桶(推荐)

- react全家桶 (推荐,生态全)

7. cocos2dx-js可以热更新吗

工作需要,在空闲时间看了下Cocos2d-JS的热更新。对其进行了一个简单的实现,这里总结分享一下。

Cocos2d-JS 热更新

Cocos2d-JS 热更新是啥?Cocos2d-JS终归还是一个游戏引擎,就以游戏的过程来理解吧。传统游戏需要更新人物动画、地图场景、游戏逻辑、背景音乐怎么办?新出一个APP放到应用商店等用户,或者好一点游戏内提示又升级并自行完整的新版本APP。

使用Cocos2d-JS的热更新,那就大不一样了。它可以做到进入游戏后需要更新的资源甚至是脚本本身,而且更新过程不需要退出游戏。只要用户联网,就能够保证使用到最新的资源。

这些场景就非常适合使用Hot Fix

想在游戏中对春节开放新活动,不能保证应用商店能准时过审核上线

发现一个严重的Bug,需要立即修复

需要经常换游戏资源,提升新鲜感

先放一个中规中矩的版本过市场审核,然后绕过审核自己直接推新内容,哈哈

对于游戏来说,这个特性是比较重量级的。不过因为JavaScript的语言特性能支持这一功能,所以Cocos2d-JS能用此特性,而Cocos2d-x无法使用。

8. web前端代码 小白求教,web前端开发的代码,是运行在哪里,是在web服务器上运行吗还是运行在浏览器端

运行在浏览器端,如果只是HTML5和js,直接在浏览器可以。
如果有后台代码,就得需要web服务器,目前主流的是Tomcat服务器。

9. 前端开发还要会UI设计吗

本质上讲两者没有关系,但是实际上是有一些重叠的,以下详细说明:
1、UI设计师具备一定的前端代码编写能力,能够在一定程度上提升自身的岗位竞争力,未来的发展空间也会更大。
2、UI设计师在互联网时代,尤其是移动互联网时代得到了广泛的关注,一个重要的原因是互联网产品对于用户的使用体验越来越关注,所以目前整个IT行业有大量的UI设计师,尤其是互联网公司更是释放出了大量的UI设计岗位。
3、UI设计师主要的岗位任务包括交互设计和视觉设计两部分,通常在产品经理和策划完成方案设计之后,UI设计师就需要完成产品原型的构建,包括交互原型和视觉方案。
4、UI设计师在反复与产品经理沟通并修改之后,最终把设计原型交由开发团队进行开发,以后在每次版本迭代的时候,都离不开UI设计师的参与,以保障产品的使用体验度不断提升。所以,在岗位职责方面,UI设计师通常并不需要参与代码的编写。
5、但是,客户需要通过直观操作理解ui
,此时需要与前端进行合作,而合作的交流成本在设计期不可忽视,如果ui自己可以做出原型,无疑更具有竞争力。

10. react native能解决热更新问题吗

上一篇和大家分享了如何在Android 现有App中集成React Native。本篇博客同样是react Native中比较经典的内容:热更新部署。
android原生App中我们实现热修复有很多种选择:Tinker、hotFix、Qzone的热更新等等。基本的思路都是大同小异的。React Native中的热更新有点像App的版本更新,也就是根据查询server端的版本和手机端目前App的版本进行对比,然后来执行是否更新的操作。根本原因在于react native的加载启动机制:React Native会将一系列资源打包成js bundle文件,系统加载js bundle文件,解析并渲染。所以,React Native热更新的根本原理就是更换js bundle文件,并重新加载,新的内容就完美的展示出来了。微软为我们提供了CodePush来简化热更新的操作,但是由于速度等原因在国内并没有备受青睐。本篇内容就以自己服务器来更新的方式实现。