前言介紹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