1.nuxt3怎么样,网站新项目可以上吗?
2.爬虫 | Python搞定软科中国大学排名
3.nuxt.js + localStorage
4.如何找到软件的源代码
5.Mathjax加载慢,如何在Nuxt中加载本地JS文件
6.SSR 服务器端渲染
nuxt3怎么样,源码源码新项目可以上吗?
Nuxt3当前面临较多问题,团队急于推出新功能,解析表面看起来提升了开发体验,网站但随之而来的源码源码小问题让人头疼不已。
例如在版本3.5.2中,解析试卷分析系统源码静态模式默认不会生成 _payload.json,网站这在文档中没有明确说明,源码源码只有通过GitHub问题反馈得知需要添加实验性配置选项。解析
官方Nuxtlab UI代码简洁,网站但组件功能有限,源码源码许多关键的解析定制项都无法修改。遇到最独特的网站情况是Toast默认继承主题色,且无法修改,源码源码页面展现“压缩 -> 复原”的解析效果,让人感到非常诡异。
框架自带的loading更是让人费解,尽管可以设置进度条和传入插槽显示内容,但整个页面会展现出“压缩 -> 复原”的动画效果,这在设计上显得过于怪异。关闭这个功能似乎是不可能的,只能通过复制源码解决。
Nuxt3继承了Vue3的困惑,发送请求有三种方式,其中一种还是糖,让人感到不统一。
在配置方面,Nuxt3并没有像预期那样统一,例如静态和输出配置,按照直觉应该放在nuxt.config里,php 统计 源码结果却需要放在nitro属性下,强调了nitro的存在。nitro本身也十分难用,如果要统一处理请求结果,最好的方式是自定义一个customHandler,通过一个handler包装另一个handler。
应用的配置也出现了两个选项,分别称为nuxt.config和app.config。即便在版本3.5.2,这样的复杂性让人感到难以接受。
综合来看,Nuxt3在提供新功能的同时,也带来了不少问题和复杂性,是否适合新项目,需要开发者根据项目需求和团队对这些问题的接受程度来决定。在使用时,需要有足够耐心和灵活性来适应其特性和需求。
爬虫 | Python搞定软科中国大学排名
大家好,我是Python当打之年
近期很多粉丝询问如何通过Python进行软科中国大学排名的爬虫分析,本期就为大家详细解析这一过程,希望对大家有所帮助,以下内容仅供参考,请勿用于其他用途。
目标网址为:shanghairanking.cn/rank...
年的中国大学排名共有所学校。
1. 网页分析
每页展示所学校信息,共页。通过翻页发现网址并未发生变化,说明页面信息是通过动态加载的方式展示的,因此无法通过get传参的SPDIF解码 源码方式切换网页进行爬取。通过按F或右键选择审查元素,搜索清华大学查看网页结构,可以看到信息存储在payload.js文件中。继续分析该文件,可以发现这里有所学校的所有信息,说明网页显示的内容是通过javascript解析这个文件动态加载进去的,因此我们只需要解析这个文件即可。
2. 解析js文件
查看学校的具体字段信息,文件内容格式不规则,既有类似json格式的信息,也有JavaScript的语法,因此不能直接使用json进行解析,这里我们使用re正则提取。
生成Dataframe,信息齐全,但其中包含很多a,f,e,q,[i,l,j],ei,eg,ek...等字符信息,这些应该是某些信息的替代字符,类似于函数中的形参。
继续分析payload.js文件的开头部分,补充知识:NUXT_JSONP是JavaScript中的一个全局变量,在使用uxtjs架构时会自动生成,用于在客户端渲染(CSR)模式下获取服务器端渲染(SSR)的数据。在Nuxt.is的客户端渲染模式下,NUXT_JSONP变量的值是一个函数,用于将服务器端渲染的数据注入到客户端渲染的页面中。这个函数的参数是服务器端渲染的数据,返回值是将这些数据注入到页面中的代码。因此,__NUXT_JSONP__变量的xpath helper 源码类型是一个函数,可以看出现有的function和return就是内层函数(存在函数嵌套)及其返回值,那么(a,b,c,d...ps,pt,pu,pv)就是函数的参数。
文件的结尾部分,这里就是外层函数的参数,仔细对比会发现外层函数的参数和上面内层函数的参数是一一对应的,因此进行字典映射即可。
3. 变量替换
获取实际值,结果如下,保存表格数据。
4. 可视化源码+数据:
在线运行地址(含全部代码):heywhale.com/mw/project...
以上就是本期为大家整理的全部内容,赶快动手练习吧,喜欢的朋友可以点赞、收藏,也可以分享让更多人知道。更多内容敬请关注(公众号:Python当打之年)
推荐阅读:
nuxt.js + localStorage
在 Vue.js 开发中,localStorage 和 sessionStorage 提供了在浏览器中存储数据的能力。然而,当使用 nuxt.js 这样的服务端渲染框架时,直接使用 localStorage 将会遇到问题,因为 nuxt.js 期望的上下文与浏览器中的 localStorage 不兼容。为解决这一问题,可以采用三种策略:客户端初始化 Store、使用 cookie 或 nuxt-vuex-localStorage 插件。 选择 nuxt-vuex-localStorage 插件的原因有以下几点:服务端渲染不会受到任何影响。
提供了 localStorage 和 sessionStorage 的支持。
数据加密功能,确保了数据安全。
支持设置过期时间,方便数据管理。梦幻武神源码
操作简单,类似于常规的 Vuex 操作。
使用插件的关键步骤包括:初始化 Store 文件,用于本地存储数据。
在 modules 注册 Store 文件,确保每个页面可独立缓存。
处理数组或对象数据时,需创建副本以避免直接修改。
在对象外部保存数据,确保正确访问。
注意缓存生命周期,避免死循环。
在使用过程中,还需注意以下注意事项:在单文件组件中操作数组或对象需谨慎,避免引用类型错误。
理解数据存储与读取的顺序,确保 DOM 渲染的正确性。
在使用过程中遇到的问题,可以通过 GitHub issue 提出,获得官方解答。另外,使用尝试缓存(try-cache)机制,以应对浏览器本地存储功能关闭或隐身模式下可能出现的异常情况。深入研究插件的源代码,了解其具体实现方式,或在 GitHub 讨论区提问,能够获得最直接、有效的答案。在实际应用中,结合这些策略与注意事项,能够有效地在 nuxt.js 项目中利用 localStorage 提供的数据持久化能力。如何找到软件的源代码
源码就是指编写的最原始程序的代码。运行的软件是要经过编写的,程序员编写程序的过程中需要他们的“语言”。音乐家用五线谱和音符,建筑师用图纸和笔,那程序员的工作的语言就是“源码”了。
人们平时使用软件时就是程序把“源码”翻译成我们可直观的形式表现出来供我们使用的。[1]
任何一个网站页面,换成源码就是一堆按一定格式书写的文字和符号,但我们的浏览器帮我们翻译成眼前的模样了
Mathjax加载慢,如何在Nuxt中加载本地JS文件
在 Vue 或 Nuxt 中如何渲染数学公式?本文将探讨在 Nuxt 中使用 Mathjax 的方法。尽管使用 CDN 加载 Mathjax 便于集成,但它可能影响页面性能,导致加载速度变慢。
为提升性能,本地加载 Mathjax 提供了一种解决方案。你只需通过 npm 将 Mathjax 安装至项目中即可。
然而,要在 Nuxt 中整合 Mathjax 并非易事,因可用资源有限,且遵循官方文档可能不适用于 Nuxt。此时,本地加载 Mathjax 的 JS 文件成为了一种可行且简便的方法。
以下是具体操作步骤:
1. 下载 Mathjax v4.0.0-beta.6 的源代码。
2. 将所有 Mathjax 文件放置于 `public/mathjax` 目录下。若使用 VSCode 编写 Nuxt 项目,请避免报错 `To enable project-wide JavaScript/TypeScript language features, exclude large folders...` 的情况。
3. 修改 `nuxt.config.ts` 文件以确保正确配置。
通过本地加载 Mathjax 的 JS 文件,你可以在不牺牲性能的前提下,高效地在 Nuxt 应用中渲染数学公式。
SSR 服务器端渲染
近年来,服务器端渲染 (SSR) 在前端开发中越来越受欢迎,特别是与React的next框架和Vue的nuxt框架结合。不同于前端框架默认的浏览器渲染,SSR允许在服务器端生成HTML,再将预处理的静态内容发送到浏览器,形成一个交互性强的客户端应用。
常规的浏览器渲染依赖JavaScript动态生成HTML,比如React和Vue中的路由功能。相比之下,服务器端渲染则是通过后端语言(如Java配合VM模版引擎或NodeJS配合Jade)生成完整的HTML文档,这些文档在发送给浏览器之前已经预渲染好了内容。
要实现SSR,首先从新建项目开始,安装Vue及其SSR库vue-server-renderer。在testSSR目录下,创建一个简单的Vue组件,确保在HTML根元素上添加"data-server-rendered"属性,以标识这部分是由服务器端渲染的。接下来,可以创建一个HTML模板,将组件内容作为注释嵌入其中,使用fs库读取并注入到渲染器中。
为了实现服务器整合,选择Node.js的Express作为基础框架,构建一个可以处理每个请求的Vue实例。在server.js中配置Express服务器,创建app.js并配置路由和渲染逻辑。然后,将应用到index.template.html模板并测试。
在项目工程化阶段,为了兼容客户端和服务器端的需求,需要创建不同的webpack配置,例如entry-server.js和webpack.server.config.js,分别生成服务器端和客户端的bundle。通过配置vue-router和webpack,实现路由管理以及资源预加载。最后,使用createBundleRenderer处理源代码更改和source map问题,提高开发效率。
除了基础配置,Vue SSR还提供了更丰富的功能,如CSS管理、缓存管理、流式渲染等。进一步了解和实践,可以参考Vue SSR官方指南和API文档。
nodejsåå端å离ï¼
åå端å离åä¸å离åªä¸ªé度快
åå端å离å¼ã
åå端å离åå¯ä»¥å¾å¥½ç解å³åå端åå·¥ä¸åçé®é¢ï¼å°æ´å¤ç交äºé»è¾åé ç»å端æ¥å¤çï¼èå端åå¯ä»¥ä¸æ³¨äºå ¶æ¬èå·¥ä½ãèå端å¼å人ååå¯ä»¥å©ç¨nodejsæ¥æ建èªå·±çæ¬å°æå¡å¨ï¼ç´æ¥å¨æ¬å°å¼åï¼ç¶åéè¿ä¸äºæ件æ¥å°api请æ±è½¬åå°åå°ï¼è¿æ ·å°±å¯ä»¥å®å ¨æ¨¡æ线ä¸çåºæ¯ï¼å¹¶ä¸ä¸åå°è§£è¦ãå端å¯ä»¥ç¬ç«å®æä¸ç¨æ·äº¤äºçæ´ä¸ä¸ªè¿ç¨ï¼ä¸¤è é½å¯ä»¥åæ¶å¼å·¥ï¼ä¸äºç¸ä¾èµï¼å¼åæçæ´å¿«ï¼èä¸åå·¥æ¯è¾åè¡¡ã
å¨åå端å离çåºç¨æ¨¡å¼ä¸ï¼åç«¯ä» è¿åå端æéçæ°æ®ï¼ä¸å渲æHTML页é¢ï¼ä¸åæ§å¶å端çææãè³äºå端ç¨æ·çå°ä»ä¹ææï¼ä»å端请æ±çæ°æ®å¦ä½å è½½å°å端ä¸ï¼é½ç±å端èªå·±å³å®ï¼ç½é¡µæç½é¡µçå¤çæ¹å¼ï¼AppæAppçå¤çæ¹å¼ï¼ä½æ 论åªç§å端ï¼æéçæ°æ®åºæ¬ç¸åï¼åç«¯ä» éå¼åä¸å¥é»è¾å¯¹å¤æä¾æ°æ®å³å¯ã
å¦ä½å¨åå端项ç®çªåºç½ç»ä¼å¿ 1.åå端å离çæ¶æï¼1.åå端ä¸å离ï¼é¡µé¢åæ°æ®é½æ¯åä¸ä¸ªæå¡å¨è¿åçã
2.åå端å离ï¼1.å端æå¡å¨ï¼å¤ç请æ±ï¼å è½½æ°æ®ï¼è¿åååº
2.å端æå¡å¨ï¼è¿å页é¢ï¼æ°æ®é¨åéè¦ä»å端å è½½ï¼åéå¼æ¥è¯·æ±ã
2.åå端å离çä¼å¿ï¼
1.å端ï¼è´è´£é¡µé¢çæ¾ç¤ºææï¼ç¨æ·çä½éªï¼æµè§å¨çå ¼å®¹æ§
å端ï¼?è´è´£æå¡å¨ç稳å®æ§å¹¶åæ§ï¼æé«æå¡å¨æ§è½ã2.并è¡å¼åï¼æé«å¼åæçã
3.å¯ä»¥å©ç¨å®¢æ·ç«¯æ¥å¤çä¸é¨åæ°æ®ï¼éä½æå¡å¨çååã
4.å端è¿åçé误信æ¯ï¼ä¸ç´è§å°å±ç¤ºç»ç¨æ·ã
æå¡å¨
å端
è¿ç»´
åºå车åºå®
ç²¾éæ¨è
广å
ä¼ ç»MVCæ¶æååå端å离æ¶æ模å¼å¯¹æ¯
ä¸è½½Â·0è¯è®º
å¹´2ææ¥
åå端æ¶æ设计
é 读·0è¯è®ºÂ·0ç¹èµ
å¹´5ææ¥
nginxæ建åå端å离æ¶æ
é 读·0è¯è®ºÂ·4ç¹èµ
å¹´8ææ¥
åå端å离æ¶ææ¦è¿°
é 读·0è¯è®ºÂ·0ç¹èµ
å¹´6æ8æ¥
ç®åäºè§£åå端å离æ¶æï¼MVVMï¼
é 读·0è¯è®ºÂ·2ç¹èµ
å¹´3æ2æ¥
åå端åºæ¬æ¶æ
é 读·0è¯è®ºÂ·3ç¹èµ
å¹´6æ4æ¥
ä»æ¥å¿ çï¼è¶ ç«ççé©å½é©å§APPï¼èµ¶å¿«ä¸è½½ï¼
ç²¾éæ¨è
广å
åå端å离æ¶æï¼è¶ å ¨é¢è¯¦è§£~
é 读·1è¯è®ºÂ·ç¹èµ
å¹´ææ¥
çµåç³»ç»æ¶ææ»è®ºç¯
é 读·0è¯è®ºÂ·0ç¹èµ
å¹´3ææ¥
åå端å离æ¡æ¶çå®ç¨åä¼ç¹
é 读·0è¯è®ºÂ·2ç¹èµ
å¹´8æ6æ¥
åå端å离æ¶æçç¹ç¹åå«æ¯ä»ä¹ï¼
é 读·0è¯è®ºÂ·0ç¹èµ
å¹´ææ¥
åå端å离æ¶æ设计
é 读·0è¯è®ºÂ·3ç¹èµ
å¹´1ææ¥
åå端å离å¼åæ¶æ
é 读·6è¯è®ºÂ·3ç¹èµ
å¹´6æ7æ¥
Node.jsåWebå端ä¼å¿ä¸ºä»ä¹è¿ä¹å¤§ï¼
é 读·0è¯è®ºÂ·1ç¹èµ
å¹´3æ6æ¥
åºäºNodeJSçåå端å离
é 读·0è¯è®ºÂ·3ç¹èµ
å¹´5ææ¥
ææææ建åå端å¼åæ¡æ¶
é 读·è¯è®ºÂ·ç¹èµ
å¹´8ææ¥
åå端å离ææ¯ââå端æ¡æ¶
é 读·2è¯è®ºÂ·2ç¹èµ
å¹´4ææ¥
åå端å离æ¶æææ¯
é 读·0è¯è®ºÂ·0ç¹èµ
å¹´3æ9æ¥
åå端å离çä¼å¿æ¯ä»ä¹ï¼
é 读·0è¯è®ºÂ·2ç¹èµ
å¹´æ9æ¥
å端ææ¯ä½ç³»æ¡æ¶
é 读·0è¯è®ºÂ·2ç¹èµ
å¹´8ææ¥
å»é¦é¡µ
ççæ´å¤çé¨å 容
å¦ä½æ£ç¡®ç解软件系ç»æ¶æçåå端å离ï¼
é¦å ï¼è½¯ä»¶ç³»ç»æ¶æçåå端å离æ´å¤æ¯å¨è¿å å¹´ä¼´éäºèç½ççè¡ä¸ºæé«å端ä¸å端交äºçååºéçï¼æåç¨æ·çä½éªè¿è¡è¡çåºäºåå端å离æ¶æãå¦ï¼VueãNodeJSä¸å¾®æå¡æ¶æç»åãå端页é¢è¿è¡UIå±ç¤ºææ渲æï¼å端è´è´£ç¼åAPIæå¡è¿è¡æ°æ®æä¾ï¼ä¹å¯ä»¥å¼å ¥NodeJSæ¥ä½ä¸ºæ¡¥æ¢æ¶æ¥å端APIè¾åºçJSONï¼è¿åå端è¿è¡é¡µé¢å±ç°ã
å ¶æ¬¡ï¼åºäºåå端å离æ¶æä¸æ¹é¢æåååºé度ï¼å°æ°æ®è®¡ç®çè¿ç¨å¨ä¸é´å±å¤çï¼å端è¿è¡å±ç¤ºï¼é¿å ä¼ ç»ç大éæ°æ®è¯·æ±æå¡å¨çåååºäºä¸é´å±å¨å é¨å¤çæ¼æ¥å®æï¼æ§è½å¾å°äºæåï¼ä»¥å¤ç»ä»¶ãç段ãå¡çç模å¼å®ç°å¹¶è¡çå è½½ãæ¾ç¤ºï¼å¨éWiFIç3Gã2Gçå¼±ç½ç»ç¯å¢ä¸ä¼å¿æ´ä¸ºææ¾ï¼æ¨¡æ¿å¹¶è¡å è½½ï¼ä¼å å è½½ä¼å æ¾ç¤ºï¼æåç¨æ·ç交äºä½éªã
æåï¼ä»ç»å ¸çMVCæ¶æå°SSMãSSHçJavaæ¡æ¶æ¶ä»£ï¼åå°å端æ¡æ¶å¦ï¼AngularJSãVueçï¼è½ç¶ææ¯ãæ¶æä¸ç´å¨æ¼åè¿æ¥æ¬è´¨ä¸åæ¯ä¸ºäºæ´æ¹ä¾¿ç解å³éæ±ï¼åå端å离æ¶ææ´å¤çä¹æ¯å®ç°è§£è¦çè¿ç¨ï¼ä¸å°å端ä¸å端ç»å®ï¼è¿ä¹ä¸SOAçç念æ¯ç¸å»åçï¼åºäºä¼ä¸æå¡æ»çº¿å®ç°åºç¨ç³»ç»å¯¹æ¥çæ¾è¦åï¼ä»¥ææç模å¼å°åºç¨ãåæ®ãæ°æ®è¿è¡ææçè¿éä¸å¯¹æ¥ï¼ä»¥ç»ä»¶æ建ãå¹³å°æ建ãæ¶ææ¯æç模å¼å ±åé¸å»ºä¼ä¸çä¿¡æ¯å建设ï¼ä»¥æ´ä¸ä¸çå¹³å°å®ç°å ¶ä¸ä¸é¢åçå·¥ä½ï¼å©åä¼ä¸ä¿¡æ¯åçåå±ã
nodejs-koa2ï¼mvc模å¼ï¼åå端å离å端设计åå端å离ï¼å端nodejsè¿è¡ç¯å¢ï¼ä½¿ç¨koa2éæè´è´£èµæºåé ä¸ç¨æ·äº¤äºï¼å®ç°tokenéªè¯ç¨æ·èº«ä»½ï¼è·¯ç±æ§å¶ãçï¼
èªè¡ç¾åº¦è§£å³ï¼
"program":"${ workspaceFolder}\app.js"
æ¤å¤å°±æ¯æ¯å°app.jsä½ä¸ºå¯å¨æ件ã${ workspaceFolder}ä»£è¡¨æ ¹ç®å½ï¼vscå¯å¨æ¶ä¼å¨æ ¹ç®å½ä¸æ¾å°å¹¶å è½½app.jsæ件ã
åæ°ä»ç»ï¼name项ç®å称ãversionçæ¬å·ãdescription项ç®æè¿°ãmain项ç®å¯å¨æ件ãscriptså¯å¨å¿«æ·è®¾ç½®ï¼authorä½è ï¼dependencies第3æ¹ä¸é´ä»¶å称åçæ¬ã
æéè¦ç
âdependenciesâè¿éæ·»å ä¸äºè¦ç¨å°çå ï¼ä»¥ä¸æ¯è¿æ¬¡è¦ç¨å°çææçå ï¼çæ¬èªå·±æ´æ¹ã
âscriptsâè¿éæ¯ä¸äºnodejsç便æ·å½ä»¤ï¼ä¸çº¿çæ¶åä¼ç¨å°ï¼ç´æ¥å¨ç»ç«¯ä¸ï¼package.jsonå级ç®å½ï¼æ§è¡ânpmstartâå³å¯å¯å¨app.jsã
å«ç没å¥å¤ªå¤§ä½ç¨çåå³å¯ã
å¯å¨ç¸å ³é ç½®ï¼å°è£ å°config/init.jsä¸ï¼å¯å¨æ件ç´æ¥å¼ç¨å³å¯
3-6-1ãinit.js项ç®æ ¸å¿ã
å¼å¸¸å好å¤çæ¹æ³å°è£
è·¯ç±é ç½®
è§å¾æ¸²æ
æ ¸å¿éæ
3-6-2ãconfig.js项ç®åæ°é ç½®ã为ä»ä¹ä¸ç¨jsonæ件å 为jsonä¸è½å 注é
3-6-3ãtoken.js项ç®tokenç¸å ³æ¹æ³å°è£ ã
æ§è¡å项ç®ç»æä¼å¢å 两个æ件
æ°å¢
src/hello.jsã
views/index.html
æµè§å¨è®¿é®ï¼
è¾å ¥å¼è·åtoken
è·åçtokenå¦å¾ï¼
å ä¸ç¨å¸¦tokenè¿è¡è®¿é®:hello/jiaobaba,被tokenæ¦æªï¼è¿å
带ä¸token访é®ï¼hello/jiaobaba
æµè¯é¡µé¢æ¸²æï¼å跳转html页é¢ï¼ç´æ¥è®¿é®/views
ç»æï¼ï¼ï¼ï¼ï¼ï¼
éè¦æºç èç³»æ
åå端å离æ¹æ¡ä»¥åææ¯éåä½è ï¼å ³å¼å
ä¸.ä»ä¹æ¯åå端å离ï¼
ç解åå端å离大æ¦å¯ä»¥ä»3个æ¹é¢ç解ï¼
1.交äºå½¢å¼
2.代ç ç»ç»å½¢å¼
3.å¼å模å¼ä¸æµç¨
1.1交äºå½¢å¼
åå端ä¸å离
å端å°æ°æ®å页é¢ç»è£ ã渲æ好äºä¹åï¼åæµè§å¨è¾åºæç»çhtmlï¼æµè§å¨æ¥æ¶å°åä¼è§£æhtmlï¼è§£æå¼å ¥çcssãæ§è¡jsèæ¬ï¼å®ææç»ç页é¢å±ç¤ºã
åå端å离
å端åªéè¦åå端约å®å¥½æ¥æ¶ä»¥åè¿åçæ°æ®æ ¼å¼ï¼ä¸è¬ç¨JSONæ ¼å¼ï¼ï¼åå端æä¾APIæ¥å£ãå端就å¯ä»¥éè¿HTTP请æ±è°ç¨APIçæ¹å¼è¿è¡äº¤äºãå端è·åå°æ°æ®åï¼è¿è¡é¡µé¢ç»è£ ã渲æï¼æç»å¨æµè§å¨åç°ã
1.2代ç ç»ç»å½¢å¼
åå端ä¸å离
å¨webåºç¨æ©æçæ¶åï¼å端页é¢ä»¥ååå°ä¸å¡æ°æ®å¤çç代ç é½æ¾å¨ä¸ä¸ªå·¥ç¨ä¸ï¼çè³æ¾å¨åä¸ç®å½ä¸ï¼å端页é¢å¤¹æçå端代ç ãåãå端å¼åå·¥ç¨å¸é½éè¦ææ´å¥ä»£ç å¯¼å ¥å¼åå·¥å ·æè½å¼åãæ¤é¶æ®µä¸åå端代ç 以åå·¥ä½è¦å度太é«ï¼å端ä¸è½ç¬ç«å¼ååæµè¯ï¼å端人åä¹è¦ä¾èµå端å®æ页é¢åæè½å®æå¼åãæç³ç³çæ åµæ¯å端工ç¨å¸éè¦ä¼å端模æ¿ææ¯ï¼jspï¼ï¼å端工ç¨å¸è¿è¦ä¼ç¹å端ææ¯ï¼éè¦å£å¤´è¯´æ页é¢æ°æ®æ¥å£ï¼æè½é åå®æå¼åãå¦åå端åªè½å½ä¸ä¸ªâåå¾ä»âï¼åªè¾åºHTMLãCSSã以åå¾å°éä¸ä¸å¡é»è¾æ å ³çjsï¼ç¶åç±å端转å为å端jspï¼å¹¶ä¸è¿è¦åä¸å¡çjs代ç ã
åå端å离
åå端代ç æ¾å¨ä¸åçå·¥ç¨ä¸ï¼å端代ç å¯ä»¥ç¬ç«å¼åï¼éè¿mock/easy-mockææ¯æ¨¡æå端APIæå¡å¯ä»¥ç¬ç«è¿è¡ãæµè¯ï¼å端代ç ä¹å¯ä»¥ç¬ç«å¼åï¼è¿è¡ãæµè¯ï¼éè¿swaggerææ¯è½èªå¨çæAPIææ¡£ä¾å端é 读ï¼è¿å¯ä»¥è¿è¡èªå¨åæ¥å£æµè¯ï¼ä¿è¯APIçå¯ç¨æ§ï¼éä½éæé£é©ã
1.3å¼å模å¼ä¸æµç¨
åå端ä¸å离
å¨é¡¹ç®å¼åé¶æ®µï¼åç«¯æ ¹æ®åååUI设计稿ï¼ç¼åHTMLãCSS以åå°éä¸ä¸å¡æ å ³çjsï¼çº¯ææé£äºï¼ï¼å®æå交ç»åå°äººåï¼åå°äººåå°HTML转为jspï¼å¹¶éè¿JSPç模æ¿è¯æ³è¿è¡æ°æ®ç»å®ä»¥åä¸äºé»è¾æä½ãåå°å®æåï¼å°å ¨é¨ä»£ç æå ï¼å å«å端代ç ãå端代ç ææä¸ä¸ªwarï¼ç¶åé¨ç½²å°åä¸å°æå¡å¨è¿è¡ã顶å¤åä¸ä¸å¨éå离ï¼ä¹å°±æ¯æå¾çãcssãjsåå¼é¨ç½²å°nginxã
å ·ä½å¼åæµç¨å¦ä¸ï¼å¾ç¥
åå端å离
å®ç°åå端å离ä¹åï¼åç«¯æ ¹æ®åååUI设计稿ç¼åHTMLãCSS以åå°éä¸ä¸å¡æ å ³çjsï¼çº¯ææé£äºï¼ï¼å端ä¹åæ¶æ ¹æ®ååè¿è¡API设计ï¼å¹¶ä¸å端åå®APIæ°æ®è§èãçå°åå°APIå®æï¼æä» ä» æ¯APIæ°æ®è§è设å®å®æä¹åãå端å³å¯éè¿HTTPè°ç¨APIï¼æéè¿mockæ°æ®å®ææ°æ®ç»è£ 以åä¸å¡é»è¾ç¼åãåå端å¯ä»¥å¹¶è¡ï¼æè å端å è¡äºå端å¼åäºã
å ·ä½å¼åæµç¨å¦ä¸ï¼å¾ç¥
äºãåå端å离ç好å¤ä¸åå¤ã
ä»ä¸é¢3个æ¹é¢å¯¹æ¯äºä¹åï¼åå端å离æ¶æåä¼ ç»çwebæ¶æç¸æ¯ï¼æå¾å¤§çååï¼çèµ·æ¥å¥½å¤å¤å¤ãå°åºæ¯åè¿æ¯ä¸åï¼æ们è¿æ¯è¦çæ§åææ¯å¦å¼å¾æå»åã
ä»ç®ååºç¨è½¯ä»¶å¼åçåå±è¶å¿æ¥çï¼ä¸»è¦æ两æ¹é¢éè¦æ³¨æï¼
·è¶æ¥è¶æ³¨éç¨æ·ä½éªï¼éçäºèç½çåå±ï¼å¼å§å¤ç»ç«¯åã
·大ååºç¨æ¶æ模å¼æ£å¨åäºåãå¾®æå¡ååå±ã
æ们主è¦éè¿åå端å离æ¶æï¼ä¸ºæ们带æ¥ä»¥ä¸å个æ¹é¢çæåï¼
·为ä¼è´¨äº§åæé ç²¾çå¢é
éè¿å°å¼åå¢éåå端å离åï¼è®©åå端工ç¨å¸åªéè¦ä¸æ³¨äºå端æå端çå¼åå·¥ä½ï¼æ¯çåå端工ç¨å¸å®ç°èªæ²»ï¼å¹å »å ¶ç¬ç¹çææ¯ç¹æ§ï¼ç¶åæ建åºä¸ä¸ªå ¨æ å¼çç²¾çå¼åå¢éã
·æåå¼åæç
åå端å离以åï¼å¯ä»¥å®ç°åå端代ç ç解è¦ï¼åªè¦åå端æ²é约å®å¥½åºç¨æéæ¥å£ä»¥åæ¥å£åæ°ï¼ä¾¿å¯ä»¥å¼å§å¹¶è¡å¼åï¼æ éçå¾ å¯¹æ¹çå¼åå·¥ä½ç»æãä¸æ¤åæ¶ï¼å³ä½¿éæ±åçåæ´ï¼åªè¦æ¥å£ä¸æ°æ®æ ¼å¼ä¸åï¼å端å¼å人åå°±ä¸éè¦ä¿®æ¹ä»£ç ï¼åªè¦å端è¿è¡åå¨å³å¯ãå¦æ¤ä¸æ¥æ´ä¸ªåºç¨çå¼åæçå¿ ç¶ä¼æè´¨çæåã
·å®ç¾åºå¯¹å¤æå¤åçå端éæ±
å¦æå¼åå¢éè½å®æåå端å离ç转åï¼æé ä¼ç§çåå端å¢éï¼å¼åç¬ç«åï¼è®©å¼å人ååå°ä¸æ³¨ä¸ç²¾ï¼å¼åè½åå¿ ç¶ä¼æææåï¼è½å¤å®ç¾åºå¯¹åç§å¤æå¤åçå端éæ±ã
·å¢å¼ºä»£ç å¯ç»´æ¤æ§
åå端å离åï¼åºç¨ç代ç ä¸åæ¯åå端混åï¼åªæå¨è¿è¡ææä¼æè°ç¨ä¾èµå ³ç³»ãåºç¨ä»£ç å°ä¼åå¾æ´æ´æ¸ æ°ï¼ä¸è®ºæ¯ä»£ç é 读è¿æ¯ä»£ç ç»´æ¤é½ä¼æ¯ä»¥åè½»æ¾ã
é£ä¹åå端å离æä»ä¹ä¸å¥½çå°æ¹åï¼æç®åæ¯æ²¡ææ³å°ï¼é¤éä½ è¯´ä¼å¢å å端å¢éçé å¤ï¼å端工ç¨å¸ä¼åçä¸å ¨è½ããã
äºãåå端å离æ¶ææ¹æ¡ã
å®ç°åå端å离ï¼ä¸»è¦æ¯å端çææ¯æ¶æååè¾å¤§ï¼å端主è¦å为restfullé£æ ¼APIï¼ç¶åå ä¸Swaggerææ¯èªå¨çæå¨çº¿æ¥å£æ档就差ä¸å¤äºã
对äºç®åç¨äºåå端å离æ¹æ¡çå端ææ¯æ¶æ主è¦æ两ç§ï¼
Â·ä¼ ç»SPA
·æå¡ç«¯æ¸²æSSR
2.1ä¼ ç»SPA
ä¼ ç»SPAæçæ¯å页é¢åºç¨ï¼ä¹å°±æ¯æ´ä¸ªç½ç«åªæä¸ä¸ªé¡µé¢ï¼ææåè½é½éè¿è¿ä¸ä¸ªé¡µé¢æ¥åç°ãå 为ä¸ä¸ªäººçèç¼ï¼æä¸ä¸ªæ¶é´ç¹çä¸ä¸ªé¡µé¢ï¼æ¢ç¶å¦æ¤ä½å¿ è¦ä¸ååè½åå¤ä¸ªé¡µé¢å¢ï¼åªä¿çä¸ä¸ªé¡µé¢ä½ä¸ºæ¨¡æ¿ï¼ç¶åéè¿è·¯ç±è·³è½¬æ¥æ´æ°è¿ä¸ªæ¨¡æ¿é¡µé¢çå 容ä¸å°±å¯ä»¥äºåï¼ç¡®å®å¦æ¤ï¼ç°å¨éè¿reacå ¨å®¶æ¡¶ãtvueå ¨å®¶æ¡¶ï¼æ¨¡ååãè·¯ç±ãwabpackçææ¯è½»èæ举就è½å®ç°ä¸ä¸ªå页é¢åºç¨ã
å页é¢åºç¨çè¿è¡æµç¨
1.ç¨æ·éè¿æµè§å¨è®¿é®ç½ç«url
2.å页é¢çhtmlæ件ï¼index.htmlï¼è¢«ä¸è½½å°æµè§å¨ï¼æ¥çä¸è½½htmléé¢å¼ç¨çcssï¼jsã
3.cssï¼jsä¸è½½å°æµè§å¨å®æä¹åï¼æµè§å¨å¼å§è§£ææ§è¡jsåå端æå¡å¼æ¥è¯·æ±æ°æ®ã
4.请æ±æ°æ®å®æåï¼è¿è¡æ°æ®ç»å®ã渲æï¼æç»å¨ç¨æ·æµè§å¨åç°å®æ´ç页é¢ã
2.2æå¡ç«¯æ¸²æ
æå¡ç«¯æ¸²æçæ¹æ¡æçæ¯æ°æ®ç»å®ï¼æ¸²æçå·¥ä½é½æ¾å¨æå¡ç«¯å®æï¼æå¡ç«¯åæµè§å¨è¾åºæç»çhtmlã大家çå®è¿ä¸ªæ¯ä¸æ¯æ个çé®ï¼è¿ä¸æ¯ååå°äºåå端ä¸å离çæ¶ä»£äºåï¼çæ¡æ¯å¦å®çï¼å 为è¿éçæå¡ç«¯æ¯ç¨æ¥æ§è¡å端æ°æ®ç»å®ã渲æçï¼ä¹å°±æ¯ææµè§å¨çä¸é¨åå·¥ä½åæ å°äºæå¡ç«¯ãèç®åå ·å¤è¿åªç§è½åçæå¡ç«¯æ¯NodeJsæå¡ç«¯ã
å®çåçå ¶å®å°±æ¯å¨æµè§å¨ä¸å端代ç ä¸é´æå ¥äºä¸ä¸ªNodeJsæå¡ç«¯ãæµè§å¨è¯·æ±å端页é¢æ¶ï¼ä¼å ç»è¿NodeJSæå¡ç«¯ï¼ç±NodeJså»è¯»åå端页é¢ï¼å¹¶æ§è¡å¼æ¥å端APIï¼è·åå°æ°æ®åè¿è¡é¡µé¢æ°æ®ç»å®ï¼æ¸²æçå·¥ä½ï¼å®æä¸ä¸ªæç»çhtmlç¶åè¿åæµè§å¨ï¼æåæµè§å¨è¿è¡å±ç¤ºã
æå¡ç«¯æ¸²æåºç¨çè¿è¡æµç¨ï¼
1.ç¨æ·éè¿æµè§å¨è®¿é®ç½ç«url
2.NodeJSæå¡ç«¯æ¥æ¶å°è¯·æ±ï¼è¯»åå°å¯¹åºçå端htmlï¼cssï¼jsã
3.NodeJS解ææ§è¡jsåå端APIå¼æ¥è¯·æ±æ°æ®ã
4.NodeJs请æ±æ°æ®å®æä¹åï¼è¿è¡æ°æ®ç»å®ã渲æï¼å¾å°ä¸ä¸ªæç»çhtmlã
5.NodeJsåæµè§å¨è¾åºhtmlï¼æµè§å¨è¿è¡å±ç¤ºã
PSï¼å ¶å®æ¬è´¨å°±æ¯æå端ç¼åæä¸ä¸ªnodeJsçæå¡ç«¯webåºç¨ãå®æ½æå¡ç«¯æ¸²æåï¼æ们æç»è¿è¡çæ¯ä¸ä¸ªNodejsæå¡ç«¯åºç¨ãèå页é¢åºç¨æ¯æéæ页é¢é¨ç½²å°éæèµæºæå¡å¨è¿è¡è¿è¡ã
çå°è¿éï¼ä½ æ¯å¦åæçé®ï¼ä¸ºä»ä¹è¦è¿ä¹éº»ç¦ææå¡ç«¯æ¸²æå¢ï¼
2.3SPAä¸æå¡ç«¯æ¸²ææ¹æ¡å¯¹æ¯
SPAçä¼ç¹æ¯å¼åç®åï¼é¨ç½²ç®åï¼ç¼ºç¹æ¯é¦æ¬¡å è½½è¾æ ¢ï¼éè¦è¾å¥½çç½ç»ï¼ä¸å好çSEOã
soï¼ä»¥ä¸å°±æ¯ä½¿ç¨æå¡ç«¯æ¸²æççç±äºï¼æåvueå®æ¹è¯´æ³ï¼ï¼
ä¸ä¼ ç»SPA(å页åºç¨ç¨åº(Single-PageApplication))ç¸æ¯ï¼æå¡å¨ç«¯æ¸²æ(SSR)çä¼å¿ä¸»è¦å¨äºï¼
·æ´å¥½çSEOï¼ç±äºæç´¢å¼æç¬è«æåå·¥å ·å¯ä»¥ç´æ¥æ¥çå®å ¨æ¸²æç页é¢ã
请注æï¼æªè³ç®åï¼GoogleåBingå¯ä»¥å¾å¥½å¯¹åæ¥JavaScriptåºç¨ç¨åºè¿è¡ç´¢å¼ãå¨è¿éï¼åæ¥æ¯å ³é®ãå¦æä½ çåºç¨ç¨åºåå§å±ç¤ºloadingèè±å¾ï¼ç¶åéè¿Ajaxè·åå 容ï¼æåå·¥å ·å¹¶ä¸ä¼çå¾ å¼æ¥å®æååè¡æå页é¢å 容ãä¹å°±æ¯è¯´ï¼å¦æSEOå¯¹ä½ çç«ç¹è³å ³éè¦ï¼èä½ ç页é¢åæ¯å¼æ¥è·åå 容ï¼åä½ å¯è½éè¦æå¡å¨ç«¯æ¸²æ(SSR)解å³æ¤é®é¢ã
·æ´å¿«çå 容å°è¾¾æ¶é´(time-to-content)ï¼ç¹å«æ¯å¯¹äºç¼æ ¢çç½ç»æ åµæè¿è¡ç¼æ ¢ç设å¤ã
æ éçå¾ ææçJavaScripté½å®æä¸è½½å¹¶æ§è¡ï¼ææ¾ç¤ºæå¡å¨æ¸²æçæ è®°ï¼æä»¥ä½ çç¨æ·å°ä¼æ´å¿«éå°çå°å®æ´æ¸²æç页é¢ãé常å¯ä»¥äº§çæ´å¥½çç¨æ·ä½éªï¼å¹¶ä¸å¯¹äºé£äºãå 容å°è¾¾æ¶é´(time-to-content)ä¸è½¬åçç´æ¥ç¸å ³ãçåºç¨ç¨åºèè¨ï¼æå¡å¨ç«¯æ¸²æ(SSR)è³å ³éè¦ã
使ç¨æå¡å¨ç«¯æ¸²æ(SSR)æ¶è¿éè¦æä¸äºæè¡¡ä¹å¤ï¼
·å¼åæ¡ä»¶æéãæµè§å¨ç¹å®ç代ç ï¼åªè½å¨æäºçå½å¨æé©åå½æ°(lifecyclehook)ä¸ä½¿ç¨ï¼ä¸äºå¤é¨æ©å±åº(externallibrary)å¯è½éè¦ç¹æ®å¤çï¼æè½å¨æå¡å¨æ¸²æåºç¨ç¨åºä¸è¿è¡ã
·æ¶åæ建设置åé¨ç½²çæ´å¤è¦æ±ãä¸å¯ä»¥é¨ç½²å¨ä»»ä½éææ件æå¡å¨ä¸çå®å ¨éæå页é¢åºç¨ç¨åº(SPA)ä¸åï¼æå¡å¨æ¸²æåºç¨ç¨åºï¼éè¦å¤äºNode.jsserverè¿è¡ç¯å¢ã
·æ´å¤çæå¡å¨ç«¯è´è½½ãå¨Node.jsä¸æ¸²æå®æ´çåºç¨ç¨åºï¼æ¾ç¶ä¼æ¯ä» ä» æä¾éææ件çserveræ´å 大éå ç¨CPUèµæº(CPU-intensive-CPUå¯é)ï¼å æ¤å¦æä½ é¢æå¨é«æµéç¯å¢(hightraffic)ä¸ä½¿ç¨ï¼è¯·åå¤ç¸åºçæå¡å¨è´è½½ï¼å¹¶ææºå°éç¨ç¼åçç¥ã
以vue为ä¾ï¼å®æ½æå¡ç«¯æ¸²æå¯ä»¥æ¥çå®æ¹æåï¼ï¼æéæ©Nuxt.js
2.4é¢æ¸²æææ¯
å¦æä½ è°ç æå¡å¨ç«¯æ¸²æ(SSR)åªæ¯ç¨æ¥æ¹åå°æ°è¥é页é¢ï¼ä¾å¦/,/about,/contactçï¼çSEOï¼é£ä¹ä½ å¯è½éè¦é¢æ¸²æãæ é使ç¨webæå¡å¨å®æ¶å¨æç¼è¯HTMLï¼èæ¯ä½¿ç¨é¢æ¸²ææ¹å¼ï¼å¨æ建æ¶(buildtime)ç®åå°çæé对ç¹å®è·¯ç±çéæHTMLæ件ãä¼ç¹æ¯è®¾ç½®é¢æ¸²ææ´ç®åï¼å¹¶å¯ä»¥å°ä½ çå端ä½ä¸ºä¸ä¸ªå®å ¨éæçç«ç¹ã
å¦æä½ ä½¿ç¨webpackï¼ä½ å¯ä»¥ä½¿ç¨prerender-spa-pluginè½»æ¾å°æ·»å é¢æ¸²æãå®å·²ç»è¢«Vueåºç¨ç¨åºå¹¿æ³æµè¯-äºå®ä¸ï¼ä½è æ¯Vueæ ¸å¿å¢éçæåã
prerender-spa-plugin:
ä¸ãåå端å离ææ¯éå
-artTemplate+bootstrapï¼ä¸æ¨èï¼ä¸ç®å®å ¨åå端å离ï¼
-vueå ¨å®¶æ¡¶ï¼æ¨èï¼
-reactå ¨å®¶æ¡¶ï¼æ¨èï¼çæå ¨ï¼
Nuxt.js踩坑记,利用Nuxt一键生成多页面静态站点
本文介绍使用Nuxt.js创建多页面静态站点的方法,利用Nuxt.js的模板、路由配置、模块、插件和页面布局等功能,实现快速开发。
Nuxt.js是一个基于Vue.js的通用应用框架,它预设了服务端渲染应用所需的各种配置,简化了开发过程。
Nuxt.js提供了多种模板,包括starter-template、typescript-template、express-template等,用于快速创建项目。使用vue-cli可以轻松安装Nuxt.js,并生成项目结构。
项目配置方面,Nuxt.js默认配置覆盖了大部分使用情形,可以使用nuxt.config.js进行自定义设置,包括路由、模块、插件和页面布局等。
路由配置基于pages目录结构生成vue-router模块的路由配置,可以修改或添加新路由。Nuxt.js社区提供router-module等模块,实现更加个性化的自定义路由。
插件可以向Vue注入常用属性或方法,例如埋点插件用于统计PV页面浏览量。埋点插件通过plugins配置项实现,设置watch参数监听路由变化,确保每次页面进入或跳转时自动统计。
页面元信息可以通过head方法设置,避免重复的meta标签,使用hid键为每个meta标签赋予唯一标识。seo.config.js文件可以抽取公用的头部信息,与页面路由关联,实现个性化设置。
Nuxt.js中引入了layout概念,将页面划分为三层:layout、page和component,提供灵活的布局方案。指定布局可以使用页面文件中的layout属性,不指定时默认使用default布局。
状态管理方面,Nuxt.js支持vuex,无需额外配置,只需在项目根目录创建store文件夹。store支持普通方式和模块方式,实现状态树的划分。
一键静态化功能可以生成应用的静态目录和文件,方便部署。静态化时需注意资源版本更新问题,通过git控制上线,实现版本智能更新,避免文件名变动导致的git清理需求。
虽然在静态化编译时遇到一些问题,例如Nuxt.js和vue-server-renderer模块之间的兼容性问题,但可以通过修改源码或使用npm模块间接解决。
本文介绍了Nuxt.js的多个核心功能及其使用方法,旨在帮助开发者快速构建多页面静态站点。如有疑问或需要进一步了解,欢迎交流讨论。