摘要:配置之后端渲染年已經(jīng)占據(jù)前端的主流不得不承認(rèn)這也是前端的未來發(fā)展方向但是后端渲染的開發(fā)方式仍然很常見不管是個(gè)人項(xiàng)目還是商業(yè)項(xiàng)目后端渲染搞起來真是糙猛快但是借著前端發(fā)展的東風(fēng)后端渲染也有很大的改進(jìn)空間這里就介紹一下我自己的實(shí)踐經(jīng)驗(yàn)前后端不分離
webpack配置之后端渲染2017年, vue, react, angular 已經(jīng)占據(jù)前端的主流, 不得不承認(rèn)這也是前端的未來發(fā)展方向. 但是后端渲染的開發(fā)方式仍然很常見, 不管是個(gè)人項(xiàng)目還是商業(yè)項(xiàng)目, 后端渲染搞起來真是糙猛快. 但是借著前端發(fā)展的東風(fēng), 后端渲染也有很大的改進(jìn)空間. 這里就介紹一下我自己的實(shí)踐經(jīng)驗(yàn): 前后端不分離的情況下實(shí)現(xiàn)熱加載以及一定程度下的前端主導(dǎo)開發(fā). 這里以koa為例, 但是倉庫里也有django版. 理論上所有語言都可以實(shí)現(xiàn). 有興趣可以看下, 倉庫地址在文末.
效果圖 原理原理說起來還是很簡(jiǎn)單的:
獨(dú)立啟動(dòng)靜態(tài)資源服務(wù)器打包生成資源列表(manifest)
通過webpack-manifest-plugin插件生成manifest.json文件
new ManifestPlugin({ writeToFileEmit: true, publicPath: "http://localhost:5000/static/" })
文件結(jié)果如圖:
服務(wù)器讀取資源列表加載到模板文件中
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() })
這個(gè)中間件通過讀去manifest.json將資源列表掛載到ctx.state(模板變量)中, 之后就可以直接在模板中引用靜態(tài)資變量了
{{ title }} Hello, World
需要注意的是由于后端渲染的一般是多入口, 所以只需要在對(duì)應(yīng)的模板中引入需要的入口文件.
熱加載熱加載其實(shí)也有很多解決方案: browsersync, live reload 等等, 但是這些都是full reload 只是減少了f5的頻率, webpack的熱加載就方便很多了通過websocket(具體我也不清楚), 配置起來也很簡(jiǎn)單.
在入口文件中加上
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()
需要注意的有兩點(diǎn):
extract-text-webpack-plugin 加上之后就無法hot reload, 開發(fā)配置不要加上這個(gè)插件
根據(jù)webpack的文檔, 每個(gè)入口文件都需要加上下面一段代碼才能實(shí)現(xiàn) js的hot reload
if (module.hot) { module.hot.accept() }
完整配置和代碼這里就不貼了, 倉庫地址(django部分代碼在master分支): https://github.com/xiadd/wepack-mutipage
原文地址: https://github.com/xiadd/blog...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89312.html
摘要:最近簡(jiǎn)單的研究了一下,對(duì)已經(jīng)有了一個(gè)簡(jiǎn)單的認(rèn)知,主要應(yīng)用于單頁面應(yīng)用,是很不錯(cuò)的框架。創(chuàng)建好之后,在命令行直接輸入即可,當(dāng)控制臺(tái)顯示服務(wù)已啟動(dòng)則表示該服務(wù)已經(jīng)啟動(dòng)成功了。配置參數(shù)中有一項(xiàng)為這項(xiàng)配置的就是我們即將使用的模板。 最近簡(jiǎn)單的研究了一下SSR,對(duì)SSR已經(jīng)有了一個(gè)簡(jiǎn)單的認(rèn)知,主要應(yīng)用于單頁面應(yīng)用,Nuxt是SSR很不錯(cuò)的框架。也有過調(diào)研,簡(jiǎn)單的用了一下,感覺還是很不錯(cuò)。但是還是...
摘要:它會(huì)檢測(cè)出最大靜態(tài)子樹就是不需要?jiǎng)討B(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時(shí)候,它就會(huì)直接重用完全相同的同時(shí)跳過比對(duì)。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個(gè)鏈接~手把手教你從零寫一個(gè)簡(jiǎn)單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點(diǎn)和vue2+vuex2+we...
摘要:它會(huì)檢測(cè)出最大靜態(tài)子樹就是不需要?jiǎng)討B(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時(shí)候,它就會(huì)直接重用完全相同的同時(shí)跳過比對(duì)。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個(gè)鏈接~手把手教你從零寫一個(gè)簡(jiǎn)單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點(diǎn)和vue2+vuex2+we...
摘要:它會(huì)檢測(cè)出最大靜態(tài)子樹就是不需要?jiǎng)討B(tài)性的子樹并且從渲染函數(shù)中萃取出來。這樣在每次重渲染的時(shí)候,它就會(huì)直接重用完全相同的同時(shí)跳過比對(duì)。需要注意的是,中的操作必須是同步的,不可以存在異步操作的情況。 新增:哈哈,最近又推出了 vue 的文章,在這里放個(gè)鏈接~手把手教你從零寫一個(gè)簡(jiǎn)單的 VUE 感謝有人看我扯技術(shù),這篇文章主要介紹最近非?;鸬膙ue2前端框架的特點(diǎn)和vue2+vuex2+we...
摘要:使用做同構(gòu)應(yīng)用是用于開發(fā)數(shù)據(jù)不斷變化的大型應(yīng)用程序的前端框架,結(jié)合其他輪子例如和就可以開發(fā)大型的前端應(yīng)用。然后客戶端檢測(cè)到這些已經(jīng)生成的就不會(huì)重新渲染,直接使用現(xiàn)有的結(jié)構(gòu)。 使用React做同構(gòu)應(yīng)用 React是用于開發(fā)數(shù)據(jù)不斷變化的大型應(yīng)用程序的前端view框架,結(jié)合其他輪子例如redux和react-router就可以開發(fā)大型的前端應(yīng)用。 React開發(fā)之初就有一個(gè)特別的優(yōu)勢(shì),就是...
閱讀 2958·2021-11-24 09:39
閱讀 2869·2021-09-29 09:34
閱讀 3561·2021-09-24 10:23
閱讀 1746·2021-09-22 15:41
閱讀 1701·2019-08-30 15:55
閱讀 3516·2019-08-30 13:58
閱讀 2624·2019-08-30 13:11
閱讀 1669·2019-08-29 12:31