1.nuxt3怎么样,源码新项目可以上吗?
2.如何找到软件的源代码
3.nodejsåå端å离ï¼
4.vue-template-compilerï¼
5.Nuxt.js踩坑记,利用Nuxt一键生成多页面静态站点
6.ç©è½¬Puppeteer
nuxt3怎么样,源码新项目可以上吗?
Nuxt3当前面临较多问题,团队急于推出新功能,源码表面看起来提升了开发体验,源码但随之而来的源码小问题让人头疼不已。
例如在版本3.5.2中,源码博客 源码静态模式默认不会生成 _payload.json,源码这在文档中没有明确说明,源码只有通过GitHub问题反馈得知需要添加实验性配置选项。源码
官方Nuxtlab UI代码简洁,源码但组件功能有限,源码许多关键的源码定制项都无法修改。遇到最独特的源码情况是Toast默认继承主题色,且无法修改,源码页面展现“压缩 -> 复原”的源码效果,让人感到非常诡异。
框架自带的loading更是让人费解,尽管可以设置进度条和传入插槽显示内容,茶叶网站源码但整个页面会展现出“压缩 -> 复原”的动画效果,这在设计上显得过于怪异。关闭这个功能似乎是不可能的,只能通过复制源码解决。
Nuxt3继承了Vue3的困惑,发送请求有三种方式,其中一种还是糖,让人感到不统一。
在配置方面,Nuxt3并没有像预期那样统一,例如静态和输出配置,按照直觉应该放在nuxt.config里,结果却需要放在nitro属性下,强调了nitro的存在。nitro本身也十分难用,如果要统一处理请求结果,最好的室内定位源码方式是自定义一个customHandler,通过一个handler包装另一个handler。
应用的配置也出现了两个选项,分别称为nuxt.config和app.config。即便在版本3.5.2,这样的复杂性让人感到难以接受。
综合来看,Nuxt3在提供新功能的同时,也带来了不少问题和复杂性,是否适合新项目,需要开发者根据项目需求和团队对这些问题的接受程度来决定。在使用时,需要有足够耐心和灵活性来适应其特性和需求。
如何找到软件的源代码
源码就是指编写的最原始程序的代码。运行的软件是要经过编写的,程序员编写程序的过程中需要他们的“语言”。音乐家用五线谱和音符,建筑师用图纸和笔,导购网源码那程序员的工作的语言就是“源码”了。
人们平时使用软件时就是程序把“源码”翻译成我们可直观的形式表现出来供我们使用的。[1]
任何一个网站页面,换成源码就是一堆按一定格式书写的文字和符号,但我们的浏览器帮我们翻译成眼前的模样了
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å ¨å®¶æ¡¶ï¼æ¨èï¼çæå ¨ï¼
vue-template-compilerï¼
vueæä¹è§£å³
ä½ å¥½ï¼
æ¥éåå ï¼é常åºç°äºä¸äºä¾èµåºçæ´æ°æè å®è£ æ°çä¾èµåºä¹å(å¯ä»¥è®¤ä¸ºnpmupdateå·²ç»æ为ä¸ç§ä¹ æ¯)ï¼å¯¼è´äºvueåvue-template-compilerççæ¬ä¸ä¸è´ã
解å³æ¹æ¡ï¼ç»ä¸vueåvue-template-compilerççæ¬
1"vue":"2.3.4",
2"vue-template-compiler":"2.3.4",
ï¼æ³¨ï¼å¦ä¸æ示çæ¬å·åä¸ºæ ·ä¾ï¼å ·ä½å®ç°è¯·å°ä¼ä¼´ä»¬æ ¹æ®èªå·±ççæ¬å·å¯¹åºï¼
ç¶åæ§è¡ï¼npmupdateå°±å¯ä»¥äºã
éå ï¼
è¥ä¸è¿°æ¹æ³æªè§£å³é®é¢ï¼åå¯è½æ¯å 为åä¾èµåºä¹é´äº§çäºå²çªï¼è¿éæ们ä¹ææ´æ´åç解å³æ¹æ³ã
é¦å æ¥ç项ç®æ ¹ç®å½ä¸æ¯å¦çæè¿package-lock.jsonçæ件ï¼è¥æï¼å ä¹ã
ç¶åå é¤æ´ä¸ªnode_modulesç®å½ï¼éæ°é ç½®package.json(å½ç¶ï¼è¦è®°å¾ç»ä¸vueåvue-template-compilerççæ¬)
é 置好ä¹åéæ°æ§è¡ï¼npminstallï¼
OKï¼é®é¢è§£å³ã
element饿äºä¹çvueæ¡æ¶ï¼è¿è¡æ¥é已解å³ï¼Vue2.1.5å°_héå½å为_cï¼èElementç®ååççæ¬é½æ¯ç¨ä»¥åçcompilerç¼è¯çï¼å¯¼è´æ°çruntimeæ æ³è¿è¡Elementãç®åç解å³æ¹æ¡æ¯éå®Vueççæ¬ä¸º2.1.4
éå®vueç¸å ³çæ¬
#éæ°å®è£ ä¸ä¸çæ¬
"vue-template-compiler":"2.1.4"
"vue-loader":".0.0"
"vue":"2.1.4"
å ·ä½å½ä»¤å¦ä¸ï¼
npmremove#å¸è½½æ个çæ¬
npmremovevue
npmremovevue-template-compiler
npmremovevue-loader
npminstallvue@2.1.4#å®è£ æå®çæ¬
npminstallvue-template-compiler@2.1.4
npminstallvue-loader@.0.0
-æä¹è®©vueæå çæ¶åç¦ç¨angularç±äºæå å®æåï¼åéæ æ³ä½¿ç¨
æå°è¯è¿æ ·åï¼ä»¥åvue-cli3çåæ³ï¼é½æ æ³åå°ç¦ç¨ä¸¥æ ¼æ¨¡å¼
image.png
package.json
"devDependencies":{
"@vue/cli-plugin-babel":"~4.5.0",
"@vue/cli-plugin-eslint":"~4.5.0",
"@vue/cli-plugin-router":"~4.5.0",
"@vue/cli-plugin-vuex":"~4.5.0",
"@vue/cli-service":"~4.5.0",
"babel-eslint":"^.1.0",
"babel-plugin-transform-remove-console":"^6.9.4",
"copy-webpack-plugin":"^4.0.1",
"electron":"^9.0.0",
"electron-devtools-installer":"^3.1.0",
"eslint":"^6.7.2",
"eslint-plugin-vue":"^6.2.2",
"sass":"^1..5",
"sass-loader":"^8.0.2",
"svg-sprite-loader":"^6.0.",
"vue-cli-plugin-electron-builder":"~2.0.0",
"vue-template-compiler":"^2.6.",
"webpack-bundle-analyzer":"^3.9.0"
},
"eslintConfig":{
"globals":{
"__static":true
},
"root":true,
"env":{
"node":true
},
"extends":[
"plugin:vue/essential",
"eslint:recommended",
"plugin:vue/recommended"
],
"parserOptions":{
"parser":"babel-eslint"
},
"rules":{ }
}
å¯ä»¥ä½¿ç¨replace-in-fileå ¨å±æ¿æ¢æ"usestrict"å符串
ä¸¥æ ¼æ¨¡å¼ä¸éä¸¥æ ¼æ¨¡å¼
æå¨IEæµè§å¨ä¸,使ç¨strict模å¼.åç°,ä¸¥æ ¼æ¨¡å¼ä¸,ä¸å 许ä¸ä¸ªå±æ§å¤å¤å®ä¹çé误æ示,è¿ä¸ªæä¹è§£å³?
JavaScriptä¸¥æ ¼æ¨¡å¼
JavaScriptçä¸¥æ ¼æ¨¡å¼è¯¥æä¹ç解ï¼ä»å¤©çäºes6ï¼å讲å°ä¸¥æ ¼æ¨¡å¼ä½æä¸ç´ä¸ç解ï¼ä¸¥æ ¼æ¨¡å¼æ¯å¹²å¥ç(=_=)
vueä¸å¦ä½ç¦ç¨ES6ä¸¥æ ¼æ¨¡å¼ã
vue项ç®ä¸å¼ç¨å¤é¨çjsæ件ä¹åï¼æ¥éå¦ä¸ï¼è¯·é®æä¹è§£å³ï¼
nuxtæå å°ç¬¬ä¸æ¹å å离
å¦é¢ï¼å¨nuxt.config.jsä¸é ç½®äºvendoråï¼æå ååºç°äºapp.chunkhash.jsï¼common.chunkhash.js,manifest.chunkhash.jsä½æ¯ææ³å°é¡¹ç®ç¨å°ç第ä¸æ¹åºåç¬æå æä¸ä¸ªæ件ï¼å¦ä½¿ç¨äºvue,axios,vuex,element-uiï¼ææææå åæ¯vue.js,axios.js,vuex.js,element-ui.jsãå°è¯ä½¿ç¨äºCommonsChunkPlugin没ææå
pyinstaller第ä¸æ¹å æå é®é¢
pyinstalleræå æ¶æ¥é:raiseJSONDecodeError("Expectingvalue",s,err.value)fromNonejson.decoder.JSONDecodeError:Expectingvalue:line1column1(char0)
3k
webpackå¦ä½æå 第ä¸æ¹åºçèµæº?
æå¨åä¸ä¸ªæ®éçä¼ ç»é¡¹ç®ï¼ç±äºä½¿ç¨äºes并ä¸ä¸äºé¡µé¢ä¸çå°ç»ä»¶ä½¿ç¨äºreactï¼æå 项ç®ä¸ºäºçäºå¿å°±ä½¿ç¨äºwebpackãåæ¥åç°jqueryçä¸äºæ件ä¸ä½¿ç¨äºéæèµæº(å¦jquery.jBox,ztreeççè¿äºæ件é½æèªå·±çå¾çåcss)ï¼è¿äºèµæºè¯¥å¦ä½å¤çå¢ï¼
javascriptä¸¥æ ¼æ¨¡å¼æ¥é
jsä¸¥æ ¼æ¨¡å¼ä½¿ç¨è´¹ä¸¥æ ¼æ¨¡å¼ç代ç æ¥é'caller','callee',and'arguments'propertiesmaynotbeaccessedonstrictmodefunctionsortheargumentsobjectsforcallstothems
3åç2.6ké 读?已解å³
Webpackå¦ä½æå 第ä¸æ¹çuiæ¡æ¶ï¼
æè¿å¨çwebpackï¼äºè§£äºåºæ¬åçãå®è·µä¸ä¹å¨åç¹ä¸è¥¿ãæ³é®ä¸ï¼å¦ænpmåºä¸æ²¡æçjsåºï¼éè¾¹æå¾çï¼æcssï¼æèªå·±çç®å½ç»æï¼è¯¥å¦ä½å¼ç¨è¿ç±»åºå°èªå·±ç项ç®ä¸å¢ï¼
2.8k
èªé¡¶åä¸å¦Reactæºç
ä»ç念å°æ¶æå°å®ç°å°ä»£ç ï¼éå½»ç解
å端æ§è½ä¼å设计é®
å端æ§è½ä¼å,é¢è¯çå¿ é®é¢ç®
vueè¿è¡æ¥éepf-fast@1.0.4devçæ¬ä¸ä¸è´ãvueçæ¬åvue-template-compilerçæ¬ä¸ä¸è´å°±ä¼åºç°è¿è¡æ¥éepf-fast@1.0.4devã解å³æ¹æ³ï¼
1ãå°node_modulesæ件夹å å é¤ã
2ãå°package.jsonæ件çVueçæ¬å·åvue-template-compilerçæ¬å·æ¹ä¸ºä¸è´ï¼2.6.7ï¼ï¼éé«ççæ¬ï¼éæ°è¿è¡npmrundevå³å¯ã
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的多个核心功能及其使用方法,旨在帮助开发者快速构建多页面静态站点。如有疑问或需要进一步了解,欢迎交流讨论。
ç©è½¬Puppeteer
1 ç®ä»Puppeteer æ¯ä¸ä¸ª Node åºï¼å®æä¾äºä¸ä¸ªé«çº§ API æ¥éè¿ DevTools åè®®æ§å¶ Chromium æ Chromeã
Puppeteer é»è®¤ä»¥æ 头模å¼ï¼headlessï¼è¿è¡ï¼ä¹å°±æ¯è¿è¡ä¸ä¸ªæ çé¢ç Chrome æµè§å¨ã
2 åºç¨åºæ¯
2.1 页é¢çæ PDF
Puppeteer æä¾äºé¡µé¢çæ PDF çæ¹æ³ï¼æ们å¯ä»¥å©ç¨è¿ä¸ªæ¹æ³æ¥å°é¡µé¢å¯¼åºä¸º PDF ï¼å¯¼åºç PDF ææå Chrome æµè§å¨æå°åè½å¯¼åºç PDF ä¸è´ã
å ·ä½çåºç¨åºæ¯æï¼
2.2 页é¢æªå¾
Puppeteer æä¾äºæªå¾çæ¹æ³ï¼æ们å¯ä»¥å©ç¨è¿ä¸ªæ¹æ³æ¥å°é¡µé¢çæå®åºå导åºä¸º jpeg æ png å¾çã
å ·ä½çåºç¨åºæ¯æï¼
2.3 æå¡ç«¯æ¸²æ
å页åºç¨ï¼SPAï¼ç主è¦å 容æ¯å¨ JavaScript åæå¡ç«¯è¯·æ±æ°æ®å渲æçï¼åå¨ç¬è«é¾ä»¥æå主è¦å 容ãé¦å±å è½½æ ¢çé®é¢ï¼èä½¿ç¨ Next.jsãNuxt.js çæå¡ç«¯æ¸²ææ¡æ¶æ¹é çææ¬è¾é«ã
å¦æåªæ¯ä¸ºäºæç´¢å¼æä¼åï¼æ们å¯ä»¥èèå©ç¨ Puppeteer æ¥å®ç°ãæ们å¯ä»¥å¨ç½å ³å±å¤æ请æ±çæ¥æºï¼å¦ææ¯ç¬è«ï¼ç´æ¥è¿åç± Puppeteer æå¡ç«¯æ¸²æç html æ件ã
2.4 èªå¨åUIæµè¯
ä½¿ç¨ Puppeteer å¯ä»¥æ¨¡æ Chrome æµè§å¨ç¯å¢ï¼ç»å JavaScript æµè¯æ¡æ¶ï¼å¦ Jestï¼å¯ä»¥å®ç°èªå¨å UI æµè¯ã
Puppeteer æä¾äº Mouse ç±»æ¥æ¨¡æé¼ æ æä½ï¼æä¾äº Keyboard ç±»æ¥æ¨¡æé®çæä½ï¼æä¾äº Touchscreen ç±»æ¥æ¨¡æ触å±æä½ï¼å¹¶ä¸ Puppeteer æä¾ç Page ç±»éæå¾å¤æ¹æ³å¯ä»¥ç¨æ¥æä½å ç´ ï¼æ¯å¦ç¹å»å ç´ ãèç¦å ç´ çæä½ã
2.5 页é¢æ£æµåæ
ä½¿ç¨ Puppeteer æä¾ç page.tracing ç³»åæ¹æ³æè·ç½ç«ç timeline trace æ¥å¯¹é¡µé¢è¿è¡æ§è½åæã
ä½¿ç¨ Puppeteer æä¾ç page.coverage ç³»åæ¹æ³æ¥è·å JavaScript å CSS è¦ççã
ä½¿ç¨ Puppeteer æä¾ç page.metrics() æ¹æ³æ¥è·åæ个æ¶é´ç¹é¡µé¢çææ æ°æ®ï¼å æ¬é¡µé¢ç documents æ°éãiframe æ°éãjs äºä»¶æ°éãdom èç¹æ°éãå¸å±æ°éãæ ·å¼éæ°è®¡ç®æ°éãå¸å±æ¶é´ãæ ·å¼éæ°è®¡ç®æ»æ¶é´ãjs 代ç æ§è¡æ»æ¶é´ãä»»å¡æ§è¡æ»æ¶é´ãå ç¨å å å大å°ãæ»çå å å大å°ã
ä½¿ç¨ Puppeteer æä¾ç Request ç±»å Response ç±»æ¥çæ§é¡µé¢åéç请æ±åæ¥åçååºã
3 åºç¡æ¦å¿µ
Puppeteer API æ¯åå±æ¬¡çï¼åæ äºæµè§å¨ç»æã
Puppeteer ä½¿ç¨ DevTools åè®®ä¸æµè§å¨è¿è¡éä¿¡ã
Browser æ¯æµè§å¨å®ä¾ï¼å¯ä»¥æå¤ä¸ªæµè§å¨ä¸ä¸æã
BrowserContext æ¯æµè§å¨ä¸ä¸æå®ä¾ï¼å®ä¹äºä¸ä¸ªæµè§ä¼è¯å¹¶å¯æ¥æå¤ä¸ªé¡µé¢ã
Page æ¯é¡µé¢å®ä¾ï¼è³å°æ¥æä¸ä¸ªæ¡æ¶ï¼ä¸»æ¡æ¶mainFrameï¼ï¼å¯è½è¿æç± iframe å建çå ¶ä»æ¡æ¶ã
Frame æ¯æ¡æ¶å®ä¾ï¼è³å°æä¸ä¸ªé»è®¤ç JavaScript æ§è¡ä¸ä¸æãå¯è½è¿æä¸æ©å±æä»¶å ³èçæ§è¡ä¸ä¸æã
Worker 表示ä¸ä¸ªWebWorkerï¼å ·æåä¸æ§è¡ä¸ä¸æã
4 å¿«éä¸æ
4.1 å®è£ puppeteer-core
npm i puppeteer-core
puppeteer-core æ¯ä¸ä¸ªè½»é级ç Puppeteer çæ¬ï¼èª 1.7.0 çæ¬ä»¥æ¥ï¼å®æ¹é½ä¼åå¸ä¸ä¸ª puppeteer-core å ï¼å®è£ è¿ä¸ªå æ¶ï¼é»è®¤ä¸ä¼ä¸è½½ Chromiumã
4.2 ä¸è½½ Chromium
Puppeteer å®ç½ï¼ .vuejs.org/v2/guide/index.html ï¼ãä½¿ç¨ Chrome æµè§å¨çæå°åè½ï¼å¨æå°é¢è§ä¸æ们å¯ä»¥çå°æå°ææåå®é ç½é¡µçå 容并ä¸ä¸è´ãè¿æ¯å 为 vue2 çå®æ¹ææ¡£ç½é¡µæ·»å äºä¸äºæå°æ ·å¼ã访é®æå°æ ·å¼æå¨çæä»¶ï¼ .vuejs.org/css/page.css ï¼å¹¶æç´¢ @media print å°±è½æç½ä¸ºä»ä¹å¨æå°é¢è§ä¸ä¸äºå ç´ ï¼å¦é¡¶æ ã侧边æ çï¼è¢«éèæè æ ·å¼ä¸åäºã
æ¥ä¸æ¥è¿å ¥æ£é¢ï¼è®©æä»¬ä½¿ç¨ Puppeteer æ¥å®ç°åæ ·çæå°ï¼å¯¼åº PDFï¼åè½ã
å¨ example ç®å½ä¸æ°å»º exportPdf.js æ件ã
pdf æ¹æ³ä¼è¿å PDF æ件ç Buffer æ°æ®ï¼ä»¥ä¾¿åç»å¤çãè¿éæ们åªæ¯æ¼ç¤ºä¸ä¸è¿ä¸ªåè½ï¼ä¼ å ¥ path åæ°å°±è½è®© pdf æ¹æ³å° PDF æ件åå°æå®è·¯å¾äºã
ä½¿ç¨ node è¿è¡è¿ä¸ª js æ件ã
node ./src/example/exportPdf.js
è¿è¡å®æ¯åï¼example ç®å½ä¸åºç°äº exportPdf.pdf æ件ãæå¼è¿ä¸ªæ件便è½çå° vue2 å®æ¹ææ¡£äºã
5.2 ç½é¡µæªå¾
å¨è¿ä¸é¨åï¼æ们æ¼ç¤ºä¸ä¸æ´ä¸ªç½é¡µæªå¾çåè½ã
å¨ example ç®å½ä¸æ°å»º exportImg.js æ件ã
ä½¿ç¨ node è¿è¡è¿ä¸ª js æ件ã
node ./src/example/exportImg.js
è¿è¡å®æ¯åï¼example ç®å½ä¸åºç°äº exportImg.png æ件ãæå¼è¿ä¸ªæ件便è½çå° vue2 å®æ¹ææ¡£äºã
SvelteKit 初学者入门实践指南 (1)
SvelteKit 初学者入门实践指南 SvelteKit 是利用 Svelte 构建 Web 应用的框架,如同 React 与 Next.js 或 Vue 与 Nuxt.js 的关系。在开始使用 SvelteKit 之前,需要先掌握 Svelte 基础知识。1. 创建 SvelteKit 应用
通过 `npm create svelte@latest blog` 创建一个简易博客程序,创建过程会询问项目类型和添加 TypeScript、Vitest 等选项,推荐选择 TypeScript 以提高编写后台代码的便利性。这里选择 "Skeleton project" 作为示例。2. 安装 Svelte VSCode 插件
安装官方 Svelte for VSCode 插件以优化编辑体验,提供对 .svelte 文件的语法支持。3. 适配器与依赖安装
安装前,修改 package.json 中的 adapter,将 "adapter-auto" 更改为 "adapter-node",以便针对云服务器或Serverless环境部署。默认的 adapter-auto 会自动选择云服务,但国内通常使用本地服务器,因此手动指定为 node。4. 编写第一个页面与路由
通过 `npm run dev` 启动开发服务器,查看初始页面并创建路由,如 src/routes/+page.svelte。注意,页面组件以 +page.svelte 标识,代表支持路由。5. 布局与URL路由
SvelteKit 使用文件夹结构表示路由,如 albums 和 about 文件夹对应相应的页面。路由规则中,+号前缀表示支持路由,避免了与 index.svelte 的混淆。6. 布局与公共内容
通过 +layout.svelte 文件组织公共内容,减少页面间的重复代码。7. 项目结构
了解项目的基本结构,包括 .svelte-kit 临时文件夹,src 存放源码和路由,static 存放静态资源,以及其他配置文件。8. 总结
通过本章节,你已建立了基础的 SvelteKit 项目,理解了适配器、路由规则和布局的应用。接下来会逐步扩展功能,深入理解 SvelteKit 的更多特性。