建设网站的模板下载学科建设的网站

pingmian/2026/1/22 19:52:51/文章来源:
建设网站的模板下载,学科建设的网站,钙网logo设计免费,ui设计包括哪些文章底部有个人公众号#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享#xff1f; 踩过的坑没必要让别人在再踩#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官#xff1a;SSR解决了什么问题… 文章底部有个人公众号热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享 踩过的坑没必要让别人在再踩自己复盘也能加深记忆。利己利人、所谓双赢。 面试官SSR解决了什么问题有做过SSR吗你是怎么做的 一、是什么 Server-Side Rendering 我们称其为SSR意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术发送到浏览器然后为其绑定状态与事件成为完全可交互页面的过程 先来看看Web3个阶段的发展史 传统服务端渲染SSR单页面应用SPA服务端渲染SSR 传统web开发 网页内容在服务端渲染完成⼀次性传输到浏览器 打开页面查看源码浏览器拿到的是全部的dom结构 单页应用SPA 单页应用优秀的用户体验使其逐渐成为主流页面内容由JS渲染出来这种方式称为客户端渲染 打开页面查看源码浏览器拿到的仅有宿主元素#app并没有内容 服务端渲染SSR SSR解决方案后端渲染出完整的首屏的dom结构返回前端拿到的内容包括首屏及完整spa结构应用激活后依然按照spa方式运行 看完前端发展我们再看看Vue官方对SSR的解释 Vue.js 是构建客户端应用程序的框架。默认情况下可以在浏览器中输出 Vue 组件进行生成 DOM 和操作DOM。然而也可以将同一个组件渲染为服务器端的 HTML字符串将它们直接发送到浏览器最后将这些静态标记激活为客户端上完全可交互的应用程序 服务器渲染的 Vue.js 应用程序也可以被认为是同构或通用因为应用程序的大部分代码都可以在服务器和客户端上运行 我们从上门解释得到以下结论 Vue SSR是一个在SPA上进行改良的服务端渲染通过Vue SSR渲染的页面需要在客户端激活才能实现交互Vue SSR将包含两部分服务端渲染的首屏包含交互的SPA 二、解决了什么 SSR主要解决了以下两种问题 seo搜索引擎优先爬取页面HTML结构使用ssr时服务端已经生成了和业务想关联的HTML有利于seo首屏呈现渲染用户无需等待页面所有js加载完成就可以看到页面视图压力来到了服务器所以需要权衡哪些用服务端渲染哪些交给客户端 但是使用SSR同样存在以下的缺点 复杂度整个项目的复杂度 库的支持性代码兼容 性能问题 每个请求都是n个实例的创建不然会污染消耗会变得很大 缓存 node serve、 nginx判断当前用户有没有过期如果没过期的话就缓存用刚刚的结果。 降级监控cpu、内存占用过多就spa返回单个的壳 服务器负载变大相对于前后端分离服务器只需要提供静态资源来说服务器负载更大所以要慎重使用 所以在我们选择是否使用SSR前我们需要慎重问问自己这些问题 1、需要SEO的页面是否只是少数几个这些是否可以使用预渲染Prerender SPA Plugin实现 2、首屏的请求响应逻辑是否复杂数据返回是否大量且缓慢 三、如何实现 对于同构开发我们依然使用webpack打包我们要解决两个问题服务端首屏渲染和客户端激活 这里需要生成一个服务器bundle文件用于服务端首屏渲染和一个客户端bundle文件用于客户端激活 代码结构 除了两个不同入口之外其他结构和之前vue应用完全相同 src ├── router ├────── index.js # 路由声明 ├── store ├────── index.js # 全局状态 ├── main.js # ⽤于创建vue实例 ├── entry-client.js # 客户端⼊⼝⽤于静态内容“激活” └── entry-server.js # 服务端⼊⼝⽤于⾸屏内容渲染 路由配置路由配置 import Vue from vue; import Router from vue-router;Vue.use(Router); //导出⼯⼚函数export function createRouter() {return new Router({mode: history,routes: [// 客户端没有编译器这⾥要写成渲染函数{ path: /, component: { render: h h(div, index page) } },{ path: /detail, component: { render: h h(div, detail page) } }]}); }主文件main.js 跟之前不同主文件是负责创建vue实例的工厂每次请求均会有独立的vue实例创建 import Vue from vue; import App from ./App.vue; import { createRouter } from ./router; // 导出Vue实例⼯⼚函数为每次请求创建独⽴实例 // 上下⽂⽤于给vue实例传递参数 export function createApp(context) {const router createRouter();const app new Vue({router,context,render: h h(App)});return { app, router }; }编写服务端入口src/entry-server.js 它的任务是创建Vue实例并根据传入url指定首屏 import { createApp } from ./main; // 返回⼀个函数接收请求上下⽂返回创建的vue实例 export default context {// 这⾥返回⼀个Promise确保路由或组件准备就绪return new Promise((resolve, reject) {const { app, router } createApp(context);// 跳转到⾸屏的地址router.push(context.url);// 路由就绪返回结果router.onReady(() {resolve(app);}, reject);}); };编写客户端入口entry-client.js 客户端入口只需创建vue实例并执行挂载这⼀步称为激活 import { createApp } from ./main; // 创建vue、router实例 const { app, router } createApp(); // 路由就绪执⾏挂载 router.onReady(() {app.$mount(#app); });对webpack进行配置 安装依赖 npm install webpack-node-externals lodash.merge -D对vue.config.js进行配置 // 两个插件分别负责打包客户端和服务端 const VueSSRServerPlugin require(vue-server-renderer/server-plugin); const VueSSRClientPlugin require(vue-server-renderer/client-plugin); const nodeExternals require(webpack-node-externals); const merge require(lodash.merge); // 根据传⼊环境变量决定⼊⼝⽂件和相应配置项 const TARGET_NODE process.env.WEBPACK_TARGET node; const target TARGET_NODE ? server : client; module.exports {css: {extract: false},outputDir: ./dist/target,configureWebpack: () ({// 将 entry 指向应⽤程序的 server / client ⽂件entry: ./src/entry-${target}.js,// 对 bundle renderer 提供 source map ⽀持devtool: source-map,// target设置为node使webpack以Node适⽤的⽅式处理动态导⼊// 并且还会在编译Vue组件时告知vue-loader输出⾯向服务器代码。target: TARGET_NODE ? node : web,// 是否模拟node全局变量node: TARGET_NODE ? undefined : false,output: {// 此处使⽤Node⻛格导出模块libraryTarget: TARGET_NODE ? commonjs2 : undefined},// https://webpack.js.org/configuration/externals/#function// https://github.com/liady/webpack-node-externals// 外置化应⽤程序依赖模块。可以使服务器构建速度更快并⽣成较⼩的打包⽂件。externals: TARGET_NODE? nodeExternals({// 不要外置化webpack需要处理的依赖模块。// 可以在这⾥添加更多的⽂件类型。例如未处理 *.vue 原始⽂件// 还应该将修改global例如polyfill的依赖模块列⼊⽩名单whitelist: [/\.css$/]}): undefined,optimization: {splitChunks: undefined},// 这是将服务器的整个输出构建为单个 JSON ⽂件的插件。// 服务端默认⽂件名为 vue-ssr-server-bundle.json// 客户端默认⽂件名为 vue-ssr-client-manifest.json。plugins: [TARGET_NODE ? new VueSSRServerPlugin() : newVueSSRClientPlugin()]}),chainWebpack: config {// cli4项⽬添加if (TARGET_NODE) {config.optimization.delete(splitChunks)}config.module.rule(vue).use(vue-loader).tap(options {merge(options, {optimizeSSR: false});});} };对脚本进行配置安装依赖 npm i cross-env -D定义创建脚本package.json scripts: {build:client: vue-cli-service build,build:server: cross-env WEBPACK_TARGETnode vue-cli-service build,build: npm run build:server npm run build:client }执行打包npm run build 最后修改宿主文件/public/index.html !DOCTYPE html html langenheadmeta charsetutf-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width,initial-scale1.0titleDocument/title/headbody!--vue-ssr-outlet--/body /html是服务端渲染入口位置注意不能为了好看而在前后加空格 安装vuex npm install -S vuex创建vuex工厂函数 import Vue from vue import Vuex from vuex Vue.use(Vuex) export function createStore () {return new Vuex.Store({state: {count:108},mutations: {add(state){state.count 1;}}}) }在main.js文件中挂载store import { createStore } from ./store export function createApp (context) {// 创建实例const store createStore()const app new Vue({store, // 挂载render: h h(App)})return { app, router, store } }服务器端渲染的是应用程序的快照如果应用依赖于⼀些异步数据那么在开始渲染之前需要先预取和解析好这些数据 在store进行一步数据获取 export function createStore() {return new Vuex.Store({mutations: {// 加⼀个初始化init(state, count) {state.count count;},},actions: {// 加⼀个异步请求count的actiongetCount({ commit }) {return new Promise(resolve {setTimeout(() {commit(init, Math.random() * 100);resolve();}, 1000);});},},}); }组件中的数据预取逻辑 export default {asyncData({ store, route }) { // 约定预取逻辑编写在预取钩⼦asyncData中// 触发 action 后返回 Promise 以便确定请求结果return store.dispatch(getCount);} };服务端数据预取entry-server.js import { createApp } from ./app; export default context {return new Promise((resolve, reject) {// 拿出store和router实例const { app, router, store } createApp(context);router.push(context.url);router.onReady(() {// 获取匹配的路由组件数组const matchedComponents router.getMatchedComponents();// 若⽆匹配则抛出异常if (!matchedComponents.length) {return reject({ code: 404 });}// 对所有匹配的路由组件调⽤可能存在的asyncData()Promise.all(matchedComponents.map(Component {if (Component.asyncData) {return Component.asyncData({store,route: router.currentRoute,});}}),).then(() {// 所有预取钩⼦ resolve 后// store 已经填充⼊渲染应⽤所需状态// 将状态附加到上下⽂且 template 选项⽤于 renderer 时// 状态将⾃动序列化为 window.__INITIAL_STATE__并注⼊ HTMLcontext.state store.state;resolve(app);}).catch(reject);}, reject);}); };客户端在挂载到应用程序之前store 就应该获取到状态entry-client.js // 导出store const { app, router, store } createApp(); // 当使⽤ template 时context.state 将作为 window.__INITIAL_STATE__ 状态⾃动嵌⼊到最终的 HTML // 在客户端挂载到应⽤程序之前store 就应该获取到状态 if (window.__INITIAL_STATE__) {store.replaceState(window.__INITIAL_STATE__); }客户端数据预取处理main.js Vue.mixin({beforeMount() {const { asyncData } this.$options;if (asyncData) {// 将获取数据操作分配给 promise// 以便在组件中我们可以在数据准备就绪后// 通过运⾏ this.dataPromise.then(...) 来执⾏其他任务this.dataPromise asyncData({store: this.$store,route: this.$route,});}}, }); 修改服务器启动文件 // 获取⽂件路径 const resolve dir require(path).resolve(__dirname, dir) // 第 1 步开放dist/client⽬录关闭默认下载index⻚的选项不然到不了后⾯路由 app.use(express.static(resolve(../dist/client), {index: false})) // 第 2 步获得⼀个createBundleRenderer const { createBundleRenderer } require(vue-server-renderer); // 第 3 步服务端打包⽂件地址 const bundle resolve(../dist/server/vue-ssr-server-bundle.json); // 第 4 步创建渲染器 const renderer createBundleRenderer(bundle, {runInNewContext: false, // https://ssr.vuejs.org/zh/api/#runinnewcontexttemplate: require(fs).readFileSync(resolve(../public/index.html), utf8), // 宿主⽂件clientManifest: require(resolve(../dist/client/vue-ssr-clientmanifest.json)) // 客户端清单 }); app.get(*, async (req,res){// 设置url和title两个重要参数const context {title:ssr test,url:req.url}const html await renderer.renderToString(context);res.send(html) })小结 使用ssr不存在单例模式每次用户请求都会创建一个新的vue实例实现ssr需要实现服务端首屏渲染和客户端激活服务端异步获取数据asyncData可以分为首屏异步获取和切换组件获取 首屏异步获取数据在服务端预渲染的时候就应该已经完成切换组件通过mixin混入在beforeMount钩子完成数据获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设服务费怎么写分录建设工程类型分为几类

在信息爆炸的时代,我们每天都会接触到大量的文件,从文档、图片到视频、音频等,各种类型、各种格式的文件充斥着我们的电脑和移动设备。如何有效地管理和组织这些文件,成为了我们不得不面对的问题。今天,我们为您带来了…

网站建设 网页开发如何使用电子商务网站

ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。但是,ECMAScript 没有类的概念,因此它的对象…

制作企业网站素材视频珠海房地产网站建设

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列这本新…

网站制作广在网站中搜索关键字

实验19:中介者模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解中介者模式的动机,掌握该模式的结构; 2、能够利用中介者模式解决实际问题。 [实验任务]:虚拟聊天室 在“虚拟聊天…

佛山提供网站设计方案公司seo关键词推广

循环展开(loop unrolling)是一种编译器优化技术,它通过减少循环的迭代次数,来提高程序的执行速度。循环展开的原理是,将循环体中的语句复制多份,每次迭代执行更多的语句,从而减少循环控制语句&a…

Wordpress 自用主题 免费 分享湛江seo代理商

时间:2024.01 目录1、安装启动 oracle19c 容器 2、rpm包安装clickhouse 3、datax安装 4、datax同步 目标库根据要同步的表,按照clickhouse建表规范建表 编写json文件 编写增量同步shell脚本,加入 crond 定时任务 1、安装启动 oracle19c 容器…

网站建设蘑菇街广州黄埔做网站的公司哪家好

装上PHP5后你会发现这样的问题:你也许会发现,输出的时间和你现在的时间是不相同的。原因是假如你不在程序或配置文件中设置你的服务器当地时区的话,PHP所取的时间是格林威治标准时间,所以和你当地的时间会有出入。格林威治标准时间…

网站怎么做qq的授权登陆网站设计技术入股

前言: FFMPEG的功能强大是毋庸置疑的,那么录屏的需求大家在某些时候大家可能是非常需要的,例如,现有的项目需要演示,因此录制一段演示视频;亦或者做内容分发直播的,比如游戏主播,需…

伊利集团网站建设实训无锡企业建站

文章目录 离线部署 python 3.x 版本1. 下载版本2. 上传到服务器3. 解压并安装4. 新建软连信息5. 注意事项 离线部署 python 3.x 版本 1. 下载版本 python 各版本下载地址 本次使用版本 Python-3.7.0a2.tgz # linux 可使用 wget 下载之后上传到所需服务器 wget https://www.py…

秦皇岛市教育考试院网站dede网站模版

这次给大家带来ESlint操作步骤详解,ESlint操作的注意事项有哪些,下面就是实战案例,一起来看一下。vue-cli脚手架创建的项目默认使用ESlint规则,启动项目的时候因为各种语法报错,不得不先停下了解一下什么是ESlint&…

秦皇岛网站制作专家新手如何给自己的网站做优化

[html] 说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染? 字体渲染: 1.解码,根据web服务器返回的(或者本地网页本身的)content-type charset等信息确定编码,将网页解码成Unicode字…

东营可以做网站的公司在哪网站后台表格

目录 一,跟正宗的bash见个面 二,实现一个山寨的bash 1.提示符 2.输入命令与回显命令 3.解析命令 4.执行命令 5.执行逻辑 三,全部代码 一,跟正宗的bash见个面 在这篇文章中,我会写一个myshell小程序。这个小程序…

国家建设部投诉网站建设部监理协会网站

描述 输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。 输入描述 输入包含两行,第一行包含一个正整数n(1 ≤ n…

海南医院网站建设乐清建设路小学网站

1、场景通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出.对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。这时候怎么办呢?可以使用linux下的mat,既Memory Analy…

fzzz主题wordpress网站优化建设扬州

在Jupyter-lab中使用RDKit画分子2D图 在做完分子对接后,想看看筛选后的分子的结构。因此想利用Jupyter-lab来画分子的2D图。 1. 安装Jupyter-lab与RDKit 系统:Win11已安装conda RDKit 是一个功能强大、灵活易用的化学信息学工具包,广泛应…

潍坊哪家网站制作公司好网站建设需要上传数据库吗

自诞生以来,OpenStack 似乎一直被质疑,其背后最重要的两大推手 NASA 和 Rackspace 都弃它而去,惠普、思科接连宣布关闭基于 OpenStack 的公有云服务,但是,OpenStack 依旧坚挺。1Q:openstack介绍A:openstack…

家教网站建设沈阳网站建设策划方案

我们都熟悉电视遥控器,它有许多按钮,每个按钮都有确定的功能。你按下电源键电视就会打开,再按下一次电视就会关闭。编程世界里也有这种模式,这就是我们说的命令模式。 命令模式是一种设计模式,它把一个请求或操作封装…

个人域名可以做企业网站吗信阳新网站做seo优化

forEach、filter、map都可以遍历数组,那么三者有什么区别? 区别: forEach遍历数组全部元素,利用回调函数对数组进行操作,不会返回新的数组,return只用于控制循环是否跳出当前循环; filter返回一个新的数组&#xff0…

企业网站建设上市公司WordPress评论加入ip

dhtmlxScheduler是一个类似于Google日历的JavaScript日程安排控件,日历事件通过Ajax动态加载,支持通过拖放功能调整事件日期和时间,事件可以按天,周,月三个种视图显示。 DHTMLX Scheduler正式版下载 在本教程中&…

宁波网站建设流程有哪些wordpress做相册

目录 思路 框架​编辑 读取操作 数据操作 绘制画面 游戏的数据结构 用二维数组来模拟棋盘格 赢的情况 平局情况 Code 代码细节部分 (1)初始化棋盘格 (2) 初始化棋子类型​编辑 事件处理部分 落子 框架内代码的完善 数据处…