加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Vue处事端渲染实践 ——Web应用首屏耗时最优化方案

发布时间:2019-03-22 03:33:36 所属栏目:建站 来源:counterxing
导读:跟着各大前端框架的降生和演变,SPA开始风行,单页面应用的上风在于可以不从头加载整个页面的环境下,通过ajax和处事器通讯,实现整个Web应用拒不更新,带来了极致的用户体验。然而,对付必要SEO、追求极致的首屏机能的应用,前端渲染的SPA是糟糕的。亏得V

为了简化这些,你可以直接在建设renderer时提供一个页面模板。大都时辰,我们会将页面模板放在特有的文件中:

  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3.   <head><title>Hello</title></head>  
  4.   <body>  
  5.     <!--vue-ssr-outlet-->  
  6.   </body>  
  7. </html> 

然后,我们可以读取和传输文件到Vue renderer中:

  1. const tpl = fs.readFileSync(path.resolve(__dirname, './index.html'), 'utf-8');  
  2. const renderer = vssr.createRenderer({  
  3.     template: tpl,  
  4. }); 

Webpack设置

然而在现实项目中,不止上述例子那么简朴,必要思量许多方面:路由、数据预取、组件化、全局状态等,以是处事端渲染不是只用一个简朴的模板,然后加上行使vue-server-renderer完成的,如下面的表示图所示:

Vue处事端渲染实践 ——Web应用首屏耗时最优化方案

如表示图所示,一样平常的Vue处事端渲染项目,有两个项目进口文件,别离为entry-client.js和entry-server.js,一个仅运行在客户端,一个仅运行在处事端,颠末Webpack打包后,会天生两个Bundle,处事端的Bundle会用于在处事端行使假造DOM天生应用措施的“快照”,客户端的Bundle会在赏识器执行。

因此,我们必要两个Webpack设置,别离定名为webpack.client.config.js和webpack.server.config.js,别离用于天生客户端Bundle与处事端Bundle,别离定名为vue-ssr-client-manifest.json与vue-ssr-server-bundle.json,关于怎样设置,Vue官方有相干示例vue-hackernews-2.0

开拓情形搭建

我地址的项目行使Koa作为Web Server Frame,项目行使koa-webpack举办开拓情形的构建。假如是在产物情形下,会天生vue-ssr-client-manifest.json与vue-ssr-server-bundle.json,包括对应的Bundle,提供客户端和处事端引用,而在开拓情形下,一样平常环境下放在内存中。行使memory-fs模块举办读取。

  1. const fs = require('fs')  
  2. const path = require( 'path' );  
  3. const webpack = require( 'webpack' );  
  4. const koaWpDevMiddleware = require( 'koa-webpack' );  
  5. const MFS = require('memory-fs');  
  6. const appSSR = require('./../../app.ssr.js');  
  7. let wpConfig;  
  8. let clientConfig, serverConfig;  
  9. let wpCompiler;  
  10. let clientCompiler, serverCompiler;  
  11. let clientManifest;  
  12. let bundle;  
  13. // 天生处事端bundle的webpack设置  
  14. if ((fs.existsSync(path.resolve(cwd,'webpack.server.config.js')))) {  
  15.   serverConfig = require(path.resolve(cwd, 'webpack.server.config.js'));  
  16.   serverCompiler = webpack( serverConfig );  
  17. }  
  18. // 天生客户端clientManifest的webpack设置  
  19. if ((fs.existsSync(path.resolve(cwd,'webpack.client.config.js')))) {  
  20.   clientConfig = require(path.resolve(cwd, 'webpack.client.config.js'));  
  21.   clientCompiler = webpack(clientConfig);  
  22. }  
  23. if (serverCompiler && clientCompiler) {  
  24.   let publicPath = clientCompiler.output && clientCompiler.output.publicPath;  
  25.   const koaDevMiddleware = await koaWpDevMiddleware({  
  26.     compiler: clientCompiler,  
  27.     devMiddleware: {  
  28.       publicPath,  
  29.       serverSideRender: true  
  30.     },  
  31.   });  
  32.   app.use(koaDevMiddleware);  
  33.   // 处事端渲染天生clientManifest  
  34.   app.use(async (ctx, next) => {  
  35.     const stats = ctx.state.webpackStats.toJson();  
  36.     const assetsByChunkName = stats.assetsByChunkName;  
  37.     stats.errors.forEach(err => console.error(err));  
  38.     stats.warnings.forEach(err => console.warn(err));  
  39.     if (stats.errors.length) {  
  40.       console.error(stats.errors);  
  41.       return;  
  42.     }  
  43.     // 天生的clientManifest放到appSSR模块,应用措施可以直接读取  
  44.     let fileSystem = koaDevMiddleware.devMiddleware.fileSystem;  
  45.     clientManifest = JSON.parse(fileSystem.readFileSync(path.resolve(cwd,'./dist/vue-ssr-client-manifest.json'), 'utf-8'));  
  46.     appSSR.clientManifest = clientManifest;  
  47.     await next();  
  48.   });  
  49.   // 处事端渲染的server bundle 存储到内存里  
  50.   const mfs = new MFS();  
  51.   serverCompiler.outputFileSystem = mfs;  
  52.   serverCompiler.watch({}, (err, stats) => {  
  53.     if (err) {  
  54.       throw err;  
  55.     }  
  56.     statsstats = stats.toJson();  
  57.     if (stats.errors.length) {  
  58.       console.error(stats.errors);  
  59.       return;  
  60.     }  
  61.     // 天生的bundle放到appSSR模块,应用措施可以直接读取  
  62.     bundle = JSON.parse(mfs.readFileSync(path.resolve(cwd,'./dist/vue-ssr-server-bundle.json'), 'utf-8'));  
  63.     appSSR.bundle = bundle;  
  64.   });  

渲染中间件设置

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读