前言介绍html
此篇写于一年前,当时仅做为本身的我的项目总结,如今换了工做,就把以前的一些经验或教训发出来,以警后人,也为你们碰到相同问题时提供解决方案,或多或少有帮助您就点个赞,若是有问题或更好的解决方式请在评论中指出或关注公众号给我留言,感谢指点。前端
总部提出新项目,大体需求就是APP内置一个H5商城,因而开始出差去总部极限开发,可没想到碰到的问题让我一个工做经验只有半年多点的应届生熬了好几宿。node
Vue-cli
VueX
作 SSR
( Vue
作 SSR
后续我会出文章说明实现方式和一些坑,有兴趣的能够点击关注获取最新文章)sass
等工程化工具user.js
(针对用户信息存储), base.js
(基础公共JS文件), url.js
(针对url的操做), http.js
(二次封装axios
)compoments
)和插件(widgets
)注册到Vue实例Router
和Page
Html
和 HTML5
控制各个模块的结构;Sass
作样式的预处理;ECMAScript 6
来开发逻辑和交互,而后经过 Webpack
和 Babel
将高级版本的 JS 编译成当下流行浏览器可以解析的 ECMAScript 5
。Node
环境运行,经过 Vue-ssr
Node 端插件,一样的前端代码也能够经过服务器端将 Html
渲染出来。Node
的进程管理是经过 PM2(process manager 2)
,它能够帮你检查进程的健康状况,并提供强大的接口,让你很容易的了解 Node 在服务器中的运行状况。Vue
Vue
及其 Vue
系列插件:
Vue-ssr
服务器端渲染模块Vue-Router
路由模块Vuex
数据流模块Vue
更加轻量级Vue
入门成本更低Vue
中文社区比较多,中文文档也翻译的很好Vue
在 GitHub
中对问题的回复也很及时Vue
语法更加忠于前端语言Vue
的解决方案更加齐全Config
: 公共环境变量相关Buiness
:
user.js
用户信息相关filter
业务相关filter
Plugins
:
bsae.js
基础公共方法库(包括精准计算,手机号脱敏,格式化金额等等)cookie.js
针对cookie操做公共方法gotoapps.js
hyBrid公共方法h5toapp.js
hyBrid公共方法url.js
针对url操做公共方法weixinShare.js
分享公共方法Components
: 公共组件
Widgets
: 公共插件
项目提测后通过压测发现node服务器版本在并发量大的状况下出现内存溢出的问题,内存不断上涨致使容器内存溢出服务暂停,服务器探针检测到服务暂停后从新开始部署操做,致使站点出现502的状况(因为压测报告包含前东家信息,因此这里不给出压测报告的数据了)。ios
// 1. 挂载的隐式变量
fun(e) {
// JS 的变量提高将其挂载到全局
bar = "this is a hidden global variable"; // 使用let进行声明
}
// 2. 直接调用的外部构造函数
fun() {
this.variable = "potential accidental global";
}
this.fun(); // 将直接执行外部构造函数改成new继承建立
复制代码
//1. 使用结束时候清除定时器
let timer = setInterval(() => {
// do something
}, 1000);
clearInterval(timer)
//2. 使用结束清除回调
let element = document.getElementById('button');
element.addEventListener('click', onClick);
element.removeEventListener('click', onClick);
element.parentNode.removeChild(element);
复制代码
cluster
模块能够建立共享服务器端口的子进程const cluster = require('cluster')
const numCPUs = require('os').cpus().length
if (cluster.isMaster) {
console.log('Master is running');
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function (worker, code, signal) {
console.log('worker ${worker.process.pid} died');
});
} else {
app.listen(port, () => {
console.log(`server started at localhost:${port}`)
})
}
复制代码
// server.js
const LRU = require('lru-cache')
const microCache = LRU({
max: 100, // 最大缓存的数目
maxAge: 1000 // 过时时间
})
const isCacheable = req => {
// 判断是否须要页面缓存
if (req.url && req.url === '/') {
return req.url
} else {
return false
}
}
app.get('*', (req, res) => {
const cacheable = isCacheable(req)
res.setHeader('Content-Type', 'text/html')
if (cacheable) {
const hit = microCache.get(req.url)
if (hit) {
return res.end(hit)
}
}
const errorHandler = err => {
if (err && err.code === 404) {
// 未找到页面
res.status(404).sendfile('./assets/error/500.html');
} else {
// 页面渲染错误
res.status(500).end('500 - Internal Server Error')
console.error(`error during render : ${req.url}`)
console.error(err)
}
}
const context = { url: req.url }
renderer.renderToString(context, (err, html) => {
if (err) {
return errorHandler(err)
}
if (context.initialState && context.initialState.htmlHead) {
res.write( indexHTML.head
.replace('<!-- TITLE -->', context.initialState.htmlHead.title)
.replace('<!-- METAS -->', context.initialState.htmlHead.metas)
.replace('<!-- SCRIPTS -->', context.initialState.htmlHead.scripts)
)
}
res.write(html);
if (context.initialState) {
res.write(
`<script>window.__INITIAL_STATE__=${serialize(context.initialState, {
isJSON: true
})}</script>`
)
}
res.end(indexHTML.tail)
// 设置当前缓存页面的内容*/
microCache.set(req.url, html)
})
})
复制代码
"build": "node --max_old_space_size=4096 build/build.js"
复制代码
pm2 start app.js --max-memory-restart 1024M
复制代码
因为开发时间紧张,在上述处理方案进行改进后,压测的效果好了一些,可是仍是达不到理想的要求,因此最终咱们放弃使用node做为服务器底层。nginx
node
服务器端相关配置,改由打包后直接由 nginx
作路由转发,再也不使用 node
服务器做为底层分发服务器node
服务器版本的绝大部分架构,去掉了部分再也不须要用到的依赖,并增长了 keep-alive
缓存,并将部分静态支持JS文件改由 npm 依赖包
获取,如 sha256 算法
等node 镜像
的基础上增长 Nginx
,并配置,将打包的过程放在 node
服务器上,打包成功后直接由 nginx
代理转发node
做为服务器改成开发使用node
服务器,生产测试均使用node
打包,利用Nginx
进行转发,打包配置更加简洁VueX
进行状态存储与组件通信Vue
的熟练使用经验,这是前端团队去到总部以后万万没有想到的,需求以及工期肯定下来以后向北京方面摇人,获得的回答是北京方面需求量很大,过不去人了,索性咱们三我的硬是顶着巨大任务量一边 coding
一边向北京方面要人。mock数据
彻底不能用,简直是shit,后端同窗并不知道咱们要的是符合真实数据结构的数据。code review
,致使不少问题在开发阶段就已经产生。jest
进行单元测试,但繁重的开发任务致使没有时间和精力进行。若有问题,请评论指正。码字不易,点个赞再走呗!git