From 4ff8bb4eeb2e1b5d1ab02183a1567a4354ff870b Mon Sep 17 00:00:00 2001 From: bigbigDreamer Date: Sun, 18 Feb 2024 12:37:42 +0000 Subject: [PATCH] Deployed 42c2507 with MkDocs version: 1.4.2 --- .nojekyll | 0 404.html | 45 + CNAME | 1 + DECLARATION/index.html | 54 + LANDMARK/index.html | 54 + assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.51d95adb.min.js | 29 + assets/javascripts/bundle.51d95adb.min.js.map | 8 + assets/javascripts/glightbox.min.js | 1 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.e5c33ebb.min.js | 42 + .../workers/search.e5c33ebb.min.js.map | 8 + assets/stylesheets/glightbox.min.css | 1 + assets/stylesheets/main.558e4712.min.css | 1 + assets/stylesheets/main.558e4712.min.css.map | 1 + assets/stylesheets/palette.2505c338.min.css | 1 + .../stylesheets/palette.2505c338.min.css.map | 1 + docs/2022/07/01/index.html | 71 + docs/2022/07/02/index.html | 84 + docs/2022/08/03/index.html | 71 + docs/2022/08/04/index.html | 84 + docs/2022/08/05/index.html | 71 + docs/2022/08/06/index.html | 91 + docs/2022/09/07/index.html | 71 + docs/2022/10/08/index.html | 71 + docs/2023/02/09/index.html | 80 + docs/2023/02/10/index.html | 88 + docs/2023/02/11/index.html | 71 + docs/2023/02/12/index.html | 72 + docs/2023/03/13/index.html | 71 + docs/2023/03/14/index.html | 79 + docs/2023/03/15/index.html | 75 + docs/2023/03/16/index.html | 86 + docs/2023/04/17/index.html | 90 + docs/2023/04/18/index.html | 87 + docs/2023/04/19/index.html | 88 + docs/2023/05/20/index.html | 71 + docs/2023/05/21/index.html | 71 + docs/2023/05/22/index.html | 105 + docs/2023/05/23/index.html | 71 + docs/2023/06/24/index.html | 83 + docs/2023/06/25/index.html | 71 + docs/2023/06/26/index.html | 71 + docs/2023/06/27/index.html | 85 + docs/2023/07/28/index.html | 72 + docs/2023/08/29/index.html | 71 + docs/2023/09/30/index.html | 71 + docs/2024/01/31/index.html | 78 + docs/2024/01/32/index.html | 110 + docs/2024/01/33/index.html | 96 + docs/2024/01/34/index.html | 172 + docs/2024/01/35/index.html | 74 + docs/2024/02/36/index.html | 89 + docs/2024/02/37/index.html | 123 + docs/CNAME | 1 + docs/favicon.png | Bin 0 -> 1710 bytes images/favicon.png | Bin 0 -> 1710 bytes images/logo.svg | 1 + index.html | 54 + overrides/main.html | 96 + search/search_index.json | 1 + sitemap.xml | 203 + sitemap.xml.gz | Bin 0 -> 395 bytes 90 files changed, 10883 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 DECLARATION/index.html create mode 100644 LANDMARK/index.html create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.51d95adb.min.js create mode 100644 assets/javascripts/bundle.51d95adb.min.js.map create mode 100644 assets/javascripts/glightbox.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.e5c33ebb.min.js create mode 100644 assets/javascripts/workers/search.e5c33ebb.min.js.map create mode 100644 assets/stylesheets/glightbox.min.css create mode 100644 assets/stylesheets/main.558e4712.min.css create mode 100644 assets/stylesheets/main.558e4712.min.css.map create mode 100644 assets/stylesheets/palette.2505c338.min.css create mode 100644 assets/stylesheets/palette.2505c338.min.css.map create mode 100644 docs/2022/07/01/index.html create mode 100644 docs/2022/07/02/index.html create mode 100644 docs/2022/08/03/index.html create mode 100644 docs/2022/08/04/index.html create mode 100644 docs/2022/08/05/index.html create mode 100644 docs/2022/08/06/index.html create mode 100644 docs/2022/09/07/index.html create mode 100644 docs/2022/10/08/index.html create mode 100644 docs/2023/02/09/index.html create mode 100644 docs/2023/02/10/index.html create mode 100644 docs/2023/02/11/index.html create mode 100644 docs/2023/02/12/index.html create mode 100644 docs/2023/03/13/index.html create mode 100644 docs/2023/03/14/index.html create mode 100644 docs/2023/03/15/index.html create mode 100644 docs/2023/03/16/index.html create mode 100644 docs/2023/04/17/index.html create mode 100644 docs/2023/04/18/index.html create mode 100644 docs/2023/04/19/index.html create mode 100644 docs/2023/05/20/index.html create mode 100644 docs/2023/05/21/index.html create mode 100644 docs/2023/05/22/index.html create mode 100644 docs/2023/05/23/index.html create mode 100644 docs/2023/06/24/index.html create mode 100644 docs/2023/06/25/index.html create mode 100644 docs/2023/06/26/index.html create mode 100644 docs/2023/06/27/index.html create mode 100644 docs/2023/07/28/index.html create mode 100644 docs/2023/08/29/index.html create mode 100644 docs/2023/09/30/index.html create mode 100644 docs/2024/01/31/index.html create mode 100644 docs/2024/01/32/index.html create mode 100644 docs/2024/01/33/index.html create mode 100644 docs/2024/01/34/index.html create mode 100644 docs/2024/01/35/index.html create mode 100644 docs/2024/02/36/index.html create mode 100644 docs/2024/02/37/index.html create mode 100644 docs/CNAME create mode 100644 docs/favicon.png create mode 100644 images/favicon.png create mode 100644 images/logo.svg create mode 100644 index.html create mode 100644 overrides/main.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..30512ff --- /dev/null +++ b/404.html @@ -0,0 +1,45 @@ + Scholar's Weekly
\ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..c52d80e --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +weekly.binlin.wang diff --git a/DECLARATION/index.html b/DECLARATION/index.html new file mode 100644 index 0000000..5f4c6e5 --- /dev/null +++ b/DECLARATION/index.html @@ -0,0 +1,54 @@ + 声明 - Scholar's Weekly
跳转至

站点声明

  1. 本站点由 不换 维护,非盈利站点,本站点内容仅用于欣赏、学习用途。

  2. 本站点部分图片来源于网络(但不限于 百度谷歌 ),最终著作权、解释权归原作者所有,如果相关引用内容有侵权嫌疑,请尽快联系 jadeface.scholar@gmail.com 删除。

  3. 本站点部分图片、内容归本作者原创,浏览者可随意使用(但不限于商用)。

  4. 本站内容默认进入 公共领域 ,即所展示内容遵循 CC0 协议

第三方资源引用

CC 图片资源导航

CC0 图片资源导航


最后更新: 2022-07-25 21:51:20
创建日期: 2022-07-25 01:39:31
\ No newline at end of file diff --git a/LANDMARK/index.html b/LANDMARK/index.html new file mode 100644 index 0000000..143b3b2 --- /dev/null +++ b/LANDMARK/index.html @@ -0,0 +1,54 @@ + 里程碑 - Scholar's Weekly
跳转至

里程碑

Release 2.2.0

  • 全站 OSS 图片开启自动转化 webp
  • 正式关闭谷歌分析
  • 优化 FCP => 0.83s
  • 优化 CSS 的加载可能会阻塞 JS 的执行

Release 2.1.0

  • 更换了小站主题色 green
  • 修复了不同周刊切换时 waline 评论插件加载失败的问题
  • 新增了页面温馨提示
  • 全站可托管静态资源支持 HTTP 2.0
  • 支持周刊创建和更新日期的显示

Release 2.0.0

  • 支持了 Email 订阅能力
  • 提供了图片懒加载能力
  • 提供了图片双击幻灯片放映效果
  • 引入 normalize.css 规范全局基础标签的样式
  • 接入了谷歌分析百度分析观测全站数据
  • 支持了 FeedBack 反馈小组件

Release 1.0.0

  • 支持了 Github Actions 自动构建能力
  • 使用 mkdocs-deploy-gh-pages 支持了部署 gh-pages 自定义域名的能力
  • 添加了免责声明
  • 添加了里程碑
  • 添加 Waline 评论系统

最后更新: 2023-02-12 21:29:23
创建日期: 2022-07-25 01:39:31
\ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.51d95adb.min.js b/assets/javascripts/bundle.51d95adb.min.js new file mode 100644 index 0000000..b20ec68 --- /dev/null +++ b/assets/javascripts/bundle.51d95adb.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Hi=Object.create;var xr=Object.defineProperty;var Pi=Object.getOwnPropertyDescriptor;var $i=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Ii=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,an=Object.prototype.propertyIsEnumerable;var on=(e,t,r)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&on(e,r,t[r]);if(kt)for(var r of kt(t))an.call(t,r)&&on(e,r,t[r]);return e};var sn=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&an.call(e,n)&&(r[n]=e[n]);return r};var Ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Fi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $i(t))!Er.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=Pi(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Hi(Ii(e)):{},Fi(t||!e||!e.__esModule?xr(r,"default",{value:e,enumerable:!0}):r,e));var fn=Ht((wr,cn)=>{(function(e,t){typeof wr=="object"&&typeof cn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(wr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(T){return!!(T&&T!==document&&T.nodeName!=="HTML"&&T.nodeName!=="BODY"&&"classList"in T&&"contains"in T.classList)}function f(T){var Ke=T.type,We=T.tagName;return!!(We==="INPUT"&&a[Ke]&&!T.readOnly||We==="TEXTAREA"&&!T.readOnly||T.isContentEditable)}function c(T){T.classList.contains("focus-visible")||(T.classList.add("focus-visible"),T.setAttribute("data-focus-visible-added",""))}function u(T){T.hasAttribute("data-focus-visible-added")&&(T.classList.remove("focus-visible"),T.removeAttribute("data-focus-visible-added"))}function p(T){T.metaKey||T.altKey||T.ctrlKey||(s(r.activeElement)&&c(r.activeElement),n=!0)}function m(T){n=!1}function d(T){s(T.target)&&(n||f(T.target))&&c(T.target)}function h(T){s(T.target)&&(T.target.classList.contains("focus-visible")||T.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(T.target))}function v(T){document.visibilityState==="hidden"&&(o&&(n=!0),B())}function B(){document.addEventListener("mousemove",z),document.addEventListener("mousedown",z),document.addEventListener("mouseup",z),document.addEventListener("pointermove",z),document.addEventListener("pointerdown",z),document.addEventListener("pointerup",z),document.addEventListener("touchmove",z),document.addEventListener("touchstart",z),document.addEventListener("touchend",z)}function re(){document.removeEventListener("mousemove",z),document.removeEventListener("mousedown",z),document.removeEventListener("mouseup",z),document.removeEventListener("pointermove",z),document.removeEventListener("pointerdown",z),document.removeEventListener("pointerup",z),document.removeEventListener("touchmove",z),document.removeEventListener("touchstart",z),document.removeEventListener("touchend",z)}function z(T){T.target.nodeName&&T.target.nodeName.toLowerCase()==="html"||(n=!1,re())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),B(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var un=Ht(Sr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},a=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(re,z){d.append(z,re)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(T){throw new Error("URL unable to set base "+c+" due to "+T)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,B=!0,re=this;["append","delete","set"].forEach(function(T){var Ke=h[T];h[T]=function(){Ke.apply(h,arguments),v&&(B=!1,re.search=h.toString(),B=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var z=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==z&&(z=this.search,B&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},a=i.prototype,s=function(f){Object.defineProperty(a,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){s(f)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr)});var Qr=Ht((Lt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Lt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Lt=="object"?Lt.ClipboardJS=r():t.ClipboardJS=r()})(Lt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ki}});var a=i(279),s=i.n(a),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(O){return!1}}var d=function(O){var w=p()(O);return m("cut"),w},h=d;function v(j){var O=document.documentElement.getAttribute("dir")==="rtl",w=document.createElement("textarea");w.style.fontSize="12pt",w.style.border="0",w.style.padding="0",w.style.margin="0",w.style.position="absolute",w.style[O?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return w.style.top="".concat(k,"px"),w.setAttribute("readonly",""),w.value=j,w}var B=function(O,w){var k=v(O);w.container.appendChild(k);var F=p()(k);return m("copy"),k.remove(),F},re=function(O){var w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof O=="string"?k=B(O,w):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?k=B(O.value,w):(k=p()(O),m("copy")),k},z=re;function T(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?T=function(w){return typeof w}:T=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},T(j)}var Ke=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=O.action,k=w===void 0?"copy":w,F=O.container,q=O.target,Le=O.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&T(q)==="object"&&q.nodeType===1){if(k==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Le)return z(Le,{container:F});if(q)return k==="cut"?h(q):z(q,{container:F})},We=Ke;function Ie(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(w){return typeof w}:Ie=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},Ie(j)}function Ti(j,O){if(!(j instanceof O))throw new TypeError("Cannot call a class as a function")}function nn(j,O){for(var w=0;w0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Ie(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var q=this;this.listener=c()(F,"click",function(Le){return q.onClick(Le)})}},{key:"onClick",value:function(F){var q=F.delegateTarget||F.currentTarget,Le=this.action(q)||"copy",Rt=We({action:Le,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Le,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return yr("action",F)}},{key:"defaultTarget",value:function(F){var q=yr("target",F);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(F){return yr("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return z(F,q)}},{key:"cut",value:function(F){return h(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof F=="string"?[F]:F,Le=!!document.queryCommandSupported;return q.forEach(function(Rt){Le=Le&&!!document.queryCommandSupported(Rt)}),Le}}]),w}(s()),ki=Ri},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,f){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(f))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return s(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=a(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return c(m,d,h);if(a.nodeList(m))return u(m,d,h);if(a.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return s(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),a=f.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var f=this;function c(){f.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=s.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var is=/["'&<>]/;Jo.exports=as;function as(e){var t=""+e,r=is.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||s(m,d)})})}function s(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof Xe?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){s("next",m)}function u(m){s("throw",m)}function p(m,d){m(d),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof xe=="function"?xe(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(a){return new Promise(function(s,f){a=e[i](a),o(s,f,a.done,a.value)})}}function o(i,a,s,f){Promise.resolve(f).then(function(c){i({value:c,done:s})},a)}}function A(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var $t=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=xe(a),f=s.next();!f.done;f=s.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var u=this.initialTeardown;if(A(u))try{u()}catch(v){i=v instanceof $t?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=xe(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{dn(h)}catch(v){i=i!=null?i:[],v instanceof $t?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new $t(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)dn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Or=Fe.EMPTY;function It(e){return e instanceof Fe||e&&"closed"in e&&A(e.remove)&&A(e.add)&&A(e.unsubscribe)}function dn(e){A(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,s=o.observers;return i||a?Or:(this.currentObservers=null,s.push(r),new Fe(function(){n.currentObservers=null,De(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new U;return r.source=this,r},t.create=function(r,n){return new wn(r,n)},t}(U);var wn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Or},t}(E);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,s=n._timestampProvider,f=n._windowTime;o||(i.push(r),!a&&i.push(s.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,s=a.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var a=r.actions;n!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Ut);var On=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var we=new On(Tn);var R=new U(function(e){return e.complete()});function Dt(e){return e&&A(e.schedule)}function kr(e){return e[e.length-1]}function Qe(e){return A(kr(e))?e.pop():void 0}function Se(e){return Dt(kr(e))?e.pop():void 0}function Vt(e,t){return typeof kr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function zt(e){return A(e==null?void 0:e.then)}function Nt(e){return A(e[ft])}function qt(e){return Symbol.asyncIterator&&A(e==null?void 0:e[Symbol.asyncIterator])}function Kt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ki(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=Ki();function Yt(e){return A(e==null?void 0:e[Qt])}function Gt(e){return ln(this,arguments,function(){var r,n,o,i;return Pt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,Xe(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,Xe(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,Xe(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return A(e==null?void 0:e.getReader)}function $(e){if(e instanceof U)return e;if(e!=null){if(Nt(e))return Qi(e);if(pt(e))return Yi(e);if(zt(e))return Gi(e);if(qt(e))return _n(e);if(Yt(e))return Bi(e);if(Bt(e))return Ji(e)}throw Kt(e)}function Qi(e){return new U(function(t){var r=e[ft]();if(A(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Yi(e){return new U(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?_(function(o,i){return e(o,i,n)}):me,Oe(1),r?He(t):zn(function(){return new Xt}))}}function Nn(){for(var e=[],t=0;t=2,!0))}function fe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,f=s===void 0?!0:s;return function(c){var u,p,m,d=0,h=!1,v=!1,B=function(){p==null||p.unsubscribe(),p=void 0},re=function(){B(),u=m=void 0,h=v=!1},z=function(){var T=u;re(),T==null||T.unsubscribe()};return g(function(T,Ke){d++,!v&&!h&&B();var We=m=m!=null?m:r();Ke.add(function(){d--,d===0&&!v&&!h&&(p=jr(z,f))}),We.subscribe(Ke),!u&&d>0&&(u=new et({next:function(Ie){return We.next(Ie)},error:function(Ie){v=!0,B(),p=jr(re,o,Ie),We.error(Ie)},complete:function(){h=!0,B(),p=jr(re,a),We.complete()}}),$(T).subscribe(u))})(c)}}function jr(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function V(e,t=document){let r=se(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function se(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),N(e===_e()),Y())}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function Yn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,we),l(()=>Be(e)),N(Be(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,we),l(()=>rr(e)),N(rr(e)))}var Bn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),xa?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ya.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Jn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Zn=typeof WeakMap!="undefined"?new WeakMap:new Bn,eo=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Ea.getInstance(),n=new Ra(t,r,this);Zn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){eo.prototype[e]=function(){var t;return(t=Zn.get(this))[e].apply(t,arguments)}});var ka=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:eo}(),to=ka;var ro=new E,Ha=I(()=>H(new to(e=>{for(let t of e)ro.next(t)}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){return Ha.pipe(S(t=>t.observe(e)),x(t=>ro.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(()=>de(e)))),N(de(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var no=new E,Pa=I(()=>H(new IntersectionObserver(e=>{for(let t of e)no.next(t)},{threshold:0}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function sr(e){return Pa.pipe(S(t=>t.observe(e)),x(t=>no.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function oo(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=de(e),o=bt(e);return r>=o.height-n.height-t}),Y())}var cr={drawer:V("[data-md-toggle=drawer]"),search:V("[data-md-toggle=search]")};function io(e){return cr[e].checked}function qe(e,t){cr[e].checked!==t&&cr[e].click()}function je(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),N(t.checked))}function $a(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ia(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(N(!1))}function ao(){let e=b(window,"keydown").pipe(_(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:io("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),_(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!$a(n,r)}return!0}),fe());return Ia().pipe(x(t=>t?R:e))}function Me(){return new URL(location.href)}function ot(e){location.href=e.href}function so(){return new E}function co(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)co(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)co(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function fo(){return location.hash.substring(1)}function uo(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Fa(){return b(window,"hashchange").pipe(l(fo),N(fo()),_(e=>e.length>0),J(1))}function po(){return Fa().pipe(l(e=>se(`[id="${e}"]`)),_(e=>typeof e!="undefined"))}function Nr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function lo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(N(e.matches))}function qr(e,t){return e.pipe(x(r=>r?t():R))}function ur(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(ce(()=>R),x(r=>r.status!==200?Tt(()=>new Error(r.statusText)):H(r)))}function Ue(e,t){return ur(e,t).pipe(x(r=>r.json()),J(1))}function mo(e,t){let r=new DOMParser;return ur(e,t).pipe(x(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function pr(e){let t=M("script",{src:e});return I(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(x(()=>Tt(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),C(()=>document.head.removeChild(t)),Oe(1))))}function ho(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function bo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(ho),N(ho()))}function vo(){return{width:innerWidth,height:innerHeight}}function go(){return b(window,"resize",{passive:!0}).pipe(l(vo),N(vo()))}function yo(){return Q([bo(),go()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(X("size")),o=Q([n,r]).pipe(l(()=>Be(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:a,size:s},{x:f,y:c}])=>({offset:{x:a.x-f,y:a.y-c+i},size:s})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(a=>{let s=document.createElement("script");s.src=i,s.onload=a,document.body.appendChild(s)})),Promise.resolve())}var r=class{constructor(n){this.url=n,this.onerror=null,this.onmessage=null,this.onmessageerror=null,this.m=a=>{a.source===this.w&&(a.stopImmediatePropagation(),this.dispatchEvent(new MessageEvent("message",{data:a.data})),this.onmessage&&this.onmessage(a))},this.e=(a,s,f,c,u)=>{if(s===this.url.toString()){let p=new ErrorEvent("error",{message:a,filename:s,lineno:f,colno:c,error:u});this.dispatchEvent(p),this.onerror&&this.onerror(p)}};let o=new EventTarget;this.addEventListener=o.addEventListener.bind(o),this.removeEventListener=o.removeEventListener.bind(o),this.dispatchEvent=o.dispatchEvent.bind(o);let i=document.createElement("iframe");i.width=i.height=i.frameBorder="0",document.body.appendChild(this.iframe=i),this.w.document.open(),this.w.document.write(`

Scholar's Weekly 第1期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词:bobdeeplBuilding future facing frontend architecturesOh Shit, Git!?!

1. Building future facing frontend architectures

大概内容就是展开讲了讲:深入探讨基于组件的前端架构是如何随着复杂度的增加而内爆的,以及如何避免这种情况。

核心的几个思想:

  • 在构建组件时,自上而下与自下而上会导致规模上的巨大不同结果。自上而下的心理模型通常是最直观的。在分解用户界面时,最常见的模型是在功能区域周围画上方框,然后成为你的组件。这种功能分解的过程是自上而下的,通常会直接导致创建具有特定抽象性的专门组件。

  • 自上而下的设计和构建会导致单体组件的产生。 一个充满了单体组件的代码库会导致一个缓慢的、对变化没有弹性的终端前端架构。 单片式组件是不好的,因为。它们的变化和维护成本很高。

  • 我们可以通过了解底层模型和情况来避免创建单体组件,这些底层模型和情况往往导致过早地创建抽象或继续扩展抽象。 React 在设计组件时更有效地适合自下而上的模式。这更有效地让你避免过早的抽象。

2. Bob

一款 macOS 平台 翻译OCR 软件。最新版本已经开始收费啦,需要的可以去 App Store 购买,但是旧版本依旧是免费的

下面简单的聊一下,怎么利用旧版本搭配 deepl 优雅的使用翻译能力~

3. Oh Shit, Git!?!

Git 是很难的:搞砸了很容易,而找出如何解决你的错误是他妈的不可能的。Git 文档有一个鸡和蛋的问题,你无法搜索如何让自己摆脱困境,除非你已经知道你需要知道的东西的名字,以便解决你的问题。因此,这里有一些我自己陷入的糟糕情况,以及我最终是如何用简单的英语使自己摆脱困境的。

🐶全文无"脏"字的帮我们树立如何摆脱使用 git 后陷入的一些常见的困境~

4. Material for MkDocs 'Scotch Bonnet'

Martin Donath,也就是 mkdocs-material 的作者,即将达到他每个月 $8000的目标。

End

最后,简单总结下这一个星期的修炼内容~

1. 给AktivJs 提了两个 FIX PR.


最后更新: 2023-02-04 23:53:49
创建日期: 2022-07-25 01:39:31
\ No newline at end of file diff --git a/docs/2022/07/02/index.html b/docs/2022/07/02/index.html new file mode 100644 index 0000000..a356f4f --- /dev/null +++ b/docs/2022/07/02/index.html @@ -0,0 +1,84 @@ + 第2期 - Scholar's Weekly

Scholar's Weekly 第2期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: 技术博客RegExpV8UMTGitHub ActionsMonoRepo

1. 如何坚持写技术博客?

相信大部分爱好输出博客的coder都有着自己的"洁癖""风格",但是往往有时候就是这些"洁癖""风格"阻碍了我们的坚持写作,文章主要从排版规范化选题系统化维护简单化来帮助我们破除障碍,值得一读~

2. magic-regexp Public

一个可以编译的、类型安全的、可读的正则表达式替代品。文档传送门

简单贴个Demo

import { createRegExp, exactly, oneOrMore, digit } from 'magic-regexp'
+
+createRegExp(
+  oneOrMore(digit)
+    .as('major')
+    .and('.')
+    .and(oneOrMore(digit).as('minor'))
+    .and(exactly('.').and(oneOrMore(char).as('patch')).optionally())
+)
+// /(?<major>(\d)+)\.(?<minor>(\d)+)(\.(?<patch>(.)+))?/
+

3. Discontinuing release blog posts

V8引擎 在 v9.9 版本之前都保持着每个新分支发布博客文章,但是官方团队宣布从 v10.0 开始将不再为每个新分支发布博客,实际上,从V9.9版本开始就没有发过了。

4. UTM

Run virtual machines on IOS and MacOS

(图片素材来源于 UMT) 官网,二次编辑合成)

以前在 IPad 上使用 iSH 启动一个 Node 静态资源服务器,用着还不错。但是 UTM 这个感觉有些耳目一新的感觉。

5. Manually Trigger a GitHub Actions

大部分情况下 Github Actions 都是自动执行的,但是如何手动的去执行呢?这里提供了示例。

name: Production Deployment
+on: 
+  workflow_dispatch:
+
(: 本站点的订阅邮件通知 Actions 就是通过手动触发的,为了保证每次迭代升级不影响主要内容的订阅用户频繁收到邮件通知。

6. How to Easily Manage Dependencies in a JS Monorepo

项目开发的依赖问题向来是开发者比较头疼的问题,但是继 pnpm 之后,原作者又诞生一大作 Bit + pnpm。以下是 Bit 对于包依赖的输出信息。

End

最后,简单总结下这一个星期的修炼内容~

1. 给 weekly 周刊小站新增了若干能力,迭代至 Release 2.0.0,也可查看 里程碑

  • 支持了 Email 订阅能力
  • 提供了图片懒加载能力
  • 提供了图片双击幻灯片放映效果
  • 引入 normalize.css 规范全局基础标签的样式
  • 接入了谷歌分析百度分析观测全站数据
  • 支持了 FeedBack 反馈小组件

2. 给 MkDocs 社区生态贡献了一份:接入国内 Waline 评论系统的方案

3. 给 Waline 社区贡献的 React 版本的收到了原作者的 👍,能收到正向反馈心情还是蛮愉悦的。


最后更新: 2023-02-04 23:53:49
创建日期: 2022-07-29 20:55:16
\ No newline at end of file diff --git a/docs/2022/08/03/index.html b/docs/2022/08/03/index.html new file mode 100644 index 0000000..3bffc00 --- /dev/null +++ b/docs/2022/08/03/index.html @@ -0,0 +1,71 @@ + 第3期 - Scholar's Weekly

Scholar's Weekly 第3期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: waifuExtensionrelease-pleaseDNSAntdV8CDN

1. waifuExtension

简单说就是,充分利用 CPUGPUANE 的的优势,利用机器学习,放大图片,并保持高度清晰。

贴个图感受下效果~

2. release-please

standard-version 已被弃用,官方推荐使用 release-please

3. DNS 查询原理详解

蛮不错的文章,阮大 出品,必属精品!下面提供下文章中出现的工具,以及相关文档地址~

我浅尝了一下子,发现个有意思的事情,阿里的 vip DNS 服务器,在 TLD 服务器中没有对应的 ip 缓存信息:

然后,我经历了一波 vip DNS 反查,最终找到了它的 ip 地址,最终,借着 DNS 解析的最后一步,找到了我的 二级域名解析记录:

4. 75CDN

360 旗下 前端静态资源库,号称 首个支持 HTTP/2CDN 服务,这次周刊站点也统一换了,看下效果:

5. Antd 准备出兼容 v5-to-v4v5-to-v3v4-to-v3 的包了

可以大致看下 V5 的计划~

6. The story of a V8 performance cliff in React

在排查问题的时候看到了这篇 V8 的文章,文末的最后,有这么一个例子,觉得挺有意思的,拿出来分享一下~

笔记

写出可读的代码,性能就会随之而来。

End

最后,简单总结下这一个星期的修炼内容~

1. 优化了 weekly 周刊小站的部分内容,迭代至 Release 2.1.0,也可查看 里程碑

  • 更换了小站主题色 green
  • 修复了不同周刊切换时 waline 评论插件加载失败的问题
  • 新增了页面温馨提示
  • 全站可托管静态资源支持 HTTP 2.0
  • 支持周刊创建和更新日期的显示

2. 给 AktivJs 提了个 Feature PR 支持了 React StrictMode 模式

3. 凌晨杰作,写了个 changesetlog forrmat 插件包:@montagejs/changelog-montage

大概效果是这样~


最后更新: 2023-02-04 23:53:49
创建日期: 2022-08-04 20:39:59
\ No newline at end of file diff --git a/docs/2022/08/04/index.html b/docs/2022/08/04/index.html new file mode 100644 index 0000000..6734177 --- /dev/null +++ b/docs/2022/08/04/index.html @@ -0,0 +1,84 @@ + 第4期 - Scholar's Weekly

Scholar's Weekly 第4期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: React习惯Open SourceCSSesbuildtypescript

1. React re-renders guide

React 重新渲染指南:一切尽在掌握。

该指南解释了什么是重新渲染,什么是必要的和不必要的重新渲染,什么可以触发 React 组件重新渲染。

还包括可以帮助防止重新渲染的最重要的模式和一些导致不必要的重新渲染和性能不佳的反模式。每个模式和反模式都附有视觉帮助和工作代码示例。

2. 新拾取的 6 个习惯和方法

------ 来自《云谦和他的朋友们》

印象比较深刻的一句话

「所有问题都应当是简单的」,如果觉得复杂,那一定是因为理解还不够到位。

3. The Three F's of Open Source Development

Fix it, Fork it, Fuck off.

我的理解,上述三个词就是开源开发者的三个境界。最坏的情况就是滚蛋,离开原作者的开源仓库(issueemaildiscussions)。

4. Finer grained control over CSS transforms with individual transform properties

csstransform 进行了更细粒度的控制。

@keyframes anim {
+    0% { transform: translateX(0%); }
+    5% { transform: translateX(5%) rotate(90deg) scale(1.2); }
+    10% { transform: translateX(10%) rotate(180deg) scale(1.2); }
+    90% { transform: translateX(90%) rotate(180deg) scale(1.2); }
+    95% { transform: translateX(95%) rotate(270deg) scale(1.2); }
+    100% { transform: translateX(100%) rotate(360deg); }
+}
+
+.target {
+    animation: anim 2s;
+    animation-fill-mode: forwards;
+}
+

5. Boost your productivity with TypeScript project references

使用 TypeScript 3.0project references 特性,来优化编译性能。

总的来说,对于 MonoRepo 项目的构建优化绝对是高效的。

国内用户,也可移步 神光 大佬的 TypeScript 编译性能优化:Project Reference.

6. esbuild 作为压缩器会对 ES5 代码做反向"优化"变成 ES6

讨论来自于 Umi 社区,之前没怎么注意 esbuild 会进行 反向"优化"

End

最后,简单总结下这一个星期的修炼内容~

1. 规划了下 montagejs 中即将出现的一个新插件 https-webpack-plugin 的蓝图。

使用 mkcertwebpack-dev-server 完成的某个阶段,完成自动本地域名 https 证书签发。

2. 给 dumi 提了个文档缺失的 docs PR : https://github.com/umijs/dumi/pull/1167

原因是,docs 文档目录会自动排出 fixtures 目录,这个在文档中并没有体现,但是我在源码中找到了。

3. 给 react-chrono 提了个 fix PR : https://github.com/prabhuignoto/react-chrono/pull/282

GitHub "遗像" 成功躺在了 3k+ star 的仓库里。

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-04 23:53:49
创建日期: 2022-08-12 20:46:03
\ No newline at end of file diff --git a/docs/2022/08/05/index.html b/docs/2022/08/05/index.html new file mode 100644 index 0000000..9df0b29 --- /dev/null +++ b/docs/2022/08/05/index.html @@ -0,0 +1,71 @@ + 第5期 - Scholar's Weekly

Scholar's Weekly 第5期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: Vitestc8preload设计模式web3islands

1. Vitest 发布了 0.22.0Break Changes 版本

相关地址:https://github.com/vitest-dev/vitest/releases

c8覆盖率支持现在需要安装同行的依赖项@vitest/coverage-c8。另外,你可以安装 @vitest/coverage-istanbul 来使用 istanbul 覆盖,而不是 c8。

2. reseter.cssrepo 中看到一个小技巧

相关地址:https://github.com/resetercss/reseter.css

正好看到了 rottenpen周刊中引用了一篇 预加载指南,这里借链引用下。

3. TypeScript 中的依赖倒置原则

相关地址:https://dev.to/jmalvarez/dependency-inversion-principle-in-typescript-4nm0

老哥分别 example 了使用 TypeScript 阐述设计模式中的 5 个设计原则。

4. 使用 web3 对用户身份进行验证

相关地址:https://dev.to/anggapur/user-authentication-with-web3-4he8

不用收集用户信息,也可识别到用户。

5. islands-architecture

相关地址:https://www.patterns.dev/posts/islands-architecture

最近听到的比较多的一个名词:孤岛架构

代表作

几个小时前,还看到 三元同学基于 React 搞了个孤岛架构实现:基于 React 的 Islands 架构实现

End

最后,简单总结下这一个星期的修炼内容~

比较忙,没做什么大东西,也没有给开源社区做贡献,不过简单做了几个小东西。

1. 花了些时间,去复习了下 HTTP 缓存相关的知识,这次比较特殊,除了翻看市面上的文章,特地结合规范去挖了挖。

掘金地址:https://juejin.cn/post/7133579119807168543

一点思考:尽信别人的文章,则不如无文章,因为规则、规范是会改变的,但是文章,过去的还是过去的。某种程度上需要不断的、主动的去吸收新的东西。

2. 给 montagejs 换了 vitest 去做 test runner

因为以前比较熟悉 jest,所以此次迁移 vitest 几乎无感,比较喜欢 vitest 提供的 ui 能力,有些像 cypress,很好的体验。

3. montagejs 中新加了两个包

can i use 灵感来自于 CanIUse 这个网站,例如我想判断 loading 在不同的浏览器环境下的 img 标签中是否支持等等。

作为轮子,手写了下图片懒加载在 react 中的应用,细节拉满。

比如:

  • 不支持 loading 做降级
  • 单页 SPA,路由跳转不会二次触发 load 或者 DOMContentLoad,需要主动触发一下懒加载
  • 懒加载的间歇时间,使用预加载弥补(基于设计模式的代理模式实现)

还在完善中,还能进化,先做了简单版本

体验地址:https://montage.bigdreamer.cc/components/mit/react-lazy-load-image

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-04 23:53:49
创建日期: 2022-08-21 19:20:54
\ No newline at end of file diff --git a/docs/2022/08/06/index.html b/docs/2022/08/06/index.html new file mode 100644 index 0000000..424f801 --- /dev/null +++ b/docs/2022/08/06/index.html @@ -0,0 +1,91 @@ + 第6期 - Scholar's Weekly

Scholar's Weekly 第6期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: reactimgfetchprioritynoopenercsp

1. million-react

相关地址:https://github.com/aidenybai/million-react

下面是 白宇彤,对于 millionreact 的相关对比输出。

背景

Many Virtual DOM libraries still struggle with render speed compared to newer methods of rendering.

与较新的渲染方法相比,许多虚拟DOM库仍然在渲染速度上挣扎。

相关地址:https://krausest.github.io/js-framework-benchmark/current.html

一些有价值的亮点:

  • Lightweight
    • tree-shaking & bundle< 1kb
  • Performance
    • 使用最新的编译器性能优化。
  • Compiler-first
    • 编译器优先
    • 对编译器的全类支持
  • .....

2. Use fetchpriority=high to load your LCP hero image sooner

相关地址:https://addyosmani.com/blog/fetch-priority/

<!-- Increase the priority of this LCP hero image --> 
+<img src="hero-image.jpg" fetchpriority="high" alt="Hero">
+
+<!-- Decrease the priority for this above-the-fold image --> 
+<img src="happy-cats.avif" fetchpriority="low" alt="Cat">
+
+<!-- The third-party contents of this iframe load with a low priority --> 
+<iframe src="https://youtu.be/JfVOS4VSpmA" fetchpriority="low"></iframe>
+
+<script> 
+// Trigger a fetch with low priority 
+let suggestedContent = await fetch("/content/suggested", {priority: "low"}); 
+</script>
+
+// Scripts that are not critical can also be loaded with low-priority 
+<script src="blocking_but_unimportant.js" fetchpriority="low"></script>
+

优先级和预加载的不同点是什么?

  • rel=preload 当浏览器发现资源(例如,解析器不可见的东西,如背景图像或需要首先加载脚本的资源)时,将其视为一种调整方式会很有帮助。
  • 优先级提示让您调整资源加载的优先级(独立于发现)。

3. About rel=noopener

相关地址:https://mathiasbynens.github.io/rel-noopener/#hax

相关 PR 地址:https://github.com/whatwg/html/pull/4330

关于 rel=noopener 这个属性,可能有些鲜为人知,也可能大部分小伙伴都是知道的,这里还是作为周刊内容再次分享。

<!-- 跳转过后无前一个页面的 `window` 操作权 -->
+<a rel="noopener" href="https://baidu.com" target="_blank">百度一下</a>
+<!-- 跳转过后有前一个页面的 `window` 操作权 -->
+<a rel="opener" href="https://baidu.com" target="_blank">百度一下,并使原页面加载一个广告页</a>
+

可以作为安全的一个话题:postMessageorigin location......

4. 为什么我在你的网站上看不到 CSP

相关地址:https://drewjarrett.medium.com/why-cant-i-see-a-content-security-policy-on-your-website-d1b5ba064ea3

  • 完全不知道 CSP 是啥。
  • 觉得很混乱,有那么多防止 XSS 的手段。
  • 一直在妨碍营销((: 例如广告位资源的加载等),必须设置 src 白名单才能正确加载
  • ......

End

最后,简单总结下这一个星期的修炼内容~

这个星期比较忙碌,工作之余的时间在看一些已经淡忘或者模糊的内容。

预计下个星期恢复正常,基本每个月都会抽一个星期去复习看重要的知识。

作为友链,对齐一下大佬周刊: rottenpen's FE News

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-04 23:53:49
创建日期: 2022-08-28 21:25:37
\ No newline at end of file diff --git a/docs/2022/09/07/index.html b/docs/2022/09/07/index.html new file mode 100644 index 0000000..58c1807 --- /dev/null +++ b/docs/2022/09/07/index.html @@ -0,0 +1,71 @@ + 第7期 - Scholar's Weekly

Scholar's Weekly 第7期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: typescriptantdchrome

1. Typescript 4.8 发布了

相关地址:https://devblogs.microsoft.com/typescript/announcing-typescript-4-8/

顺带一提,后续的发版计划。

2. 从 Chrome 轻松检测 React 组件源代码!

相关地址:https://github.com/hand-dot/react-inspector

3. Antd 5.0 准备发布 Tour 组件

与此同时,这里简单介绍另外一个引导式组件 react-shepherd

相关地址:

4. 跨平台的 node.js 应用程序指引

相关地址:https://github.com/ehmicky/cross-platform-node-guide/blob/main/docs/summary.md

End

最后,简单总结下这一个星期的修炼内容~

很抱歉,周刊休刊了 3 期,中途去做了一些事,想了一些东西,准备做一些东西。

好了,废话不多说,后面的周刊我会尽量坚持,保持不休刊。

本周主要开发了两个工具包:

plus 版本主要解决了跨平台系统的证书自动授信能力,后者则是纯的证书生成。

montagejs 的文档工具引擎,从 dumi 迁移到了 docusaurus。主要解决了以下几个问题:

  • dev 模式很慢;
  • 对原始的 monorepo 的初始配置侵入很大;
  • MDX 的语法原生支持;

可以简单体验下:文档地址

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-04 23:53:49
创建日期: 2022-09-25 18:03:22
\ No newline at end of file diff --git a/docs/2022/10/08/index.html b/docs/2022/10/08/index.html new file mode 100644 index 0000000..860a79e --- /dev/null +++ b/docs/2022/10/08/index.html @@ -0,0 +1,71 @@ + 第8期 - Scholar's Weekly

Scholar's Weekly 第8期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: typescriptstck8spdf2docxrust

1. stc

相关地址:https://github.com/dudykr/stc

一款新的:Speedy TypeScript type checker

还是很期待的,核心贡献者来自 swc 作者,大体量的项目经历 type checker 的时候,成为了项目打包编译的阻塞点,底层由 rust 编写,性能上应该会有大幅度的提升。

2. Vite vs. Next + turbopack HMR Benchmark

相关地址:https://github.com/yyx990803/vite-vs-next-turbo-hmr

尤大对比了新出的竞品 turbopack,在 hmr 上做了 diff,留下了后面的结论:

  • The Next RSC numbers are only included for reference (compare between server/client HMR in Next).
  • For the root component (big with many imports and child components), Vite and Next + turbopack are almost equally fast.
  • For the leaf component (small, no imports), Next + turbopack is about 68% faster.
  • This is quite far from the claim that "turbopack is 10x faster than Vite" as we've seen from Vercel's marketing materials.

3. Kubernetes Tutorials

相关地址:https://github.com/guangzhengli/k8s-tutorials

顾名思义,免费的 k8s 教程地址。

4. pdf2docx

相关地址:https://github.com/dothinking/pdf2docx

一款由 python 编写的 pdfdocs 工具。

5. atuin

相关地址:https://github.com/ellie/atuin

Atuin 使用 SQLite 数据库取代了你现有的 shell 历史,并为你的命令记录了额外的内容。此外,它还通过 Atuin 服务器,在机器之间提供可选的、完全加密的历史记录同步功能。

为频繁使用的 shell 命令做 history 记录,蛮有用的工具。

6. this-week-in-rust

相关地址:https://this-week-in-rust.org

Rust 每周更新摘要~

End

最后,简单总结下这一个星期的修炼内容~

  • pangu 在经历了几个版本的迭代后,终于可以投入生产正式使用了。

    目前 roadmap 完成的核心功能~

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-04 23:53:49
创建日期: 2022-10-30 13:59:08
\ No newline at end of file diff --git a/docs/2023/02/09/index.html b/docs/2023/02/09/index.html new file mode 100644 index 0000000..95c8dc1 --- /dev/null +++ b/docs/2023/02/09/index.html @@ -0,0 +1,80 @@ + 第9期 - Scholar's Weekly

Scholar's Weekly 第9期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: jotaiAnimeGANv2CssInJspipe

1. jotai 发布 V2 版本

相关地址:https://github.com/pmndrs/jotai/releases/tag/v2.0.0

大概看了下,jotai 有这么几个变动点:

New Features

  • jotai/vanilla,支持非 React 应用的使用;
  • 新增了 createStore,更加灵活的操作原子;
  • atom 的写操作更加便捷了;
    const a = atom(
    +  (get) => get(),
    +  (get, set, arg1, arg, ...rest) => {
    +    return 0;
    +  }
    +)
    +

Break Changes

  • ProviderinitialValuesprop 被移除,因为 store 它更灵活;
  • Provider 的范围属性被删除,因为你可以创建自己的上下文;
  • abortableAtomutil 已删除,因为默认情况下包含该功能;
  • waitForAllutil 已删除,因为 Promise.all 它可以正常工作;

2. 一个好玩的在线图片转动漫的工具

相关地址:https://huggingface.co/spaces/akhaliq/AnimeGANv2

3. Ant Design V5 应用级 CSSinJS 解决方案

相关地址:https://github.com/ant-design/ant-design/discussions/40489

基于 AntD V5 中所使用的 token Sys 相结合的 CSSInJS 方案;

可以作为练习,小尝一下子。

4. Css In Js简介

相关地址: https://www.infoworld.com/article/3678950/intro-to-css-in-js-generating-css-from-javascript.html

文章详尽介绍了各种 CSSInJs 库,并阐述了各种边界场景。

总结:CSSInJs 并非必须。

笔者认同作者观点,它有自己的适用场景,但非通用场景。

5. JS 管道运算符

相关地址:https://2ality.com/2022/01/pipe-operator.html

有了 rx.js 的使用经验后,愈加习惯这种 pipe 流的形式做开发。

const y = h(g(f(x))); // no pipe
+const y = x |> f(%) |> g(%) |> h(%); // Hack pipe
+const y = x |> f |> g |> h; // F# pipe
+

继洋葱嵌套之后的 pipe hack。妈妈再也不用担心不会 curryhack 了。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-04 23:53:49
创建日期: 2023-02-03 21:36:44
\ No newline at end of file diff --git a/docs/2023/02/10/index.html b/docs/2023/02/10/index.html new file mode 100644 index 0000000..e34787e --- /dev/null +++ b/docs/2023/02/10/index.html @@ -0,0 +1,88 @@ + 第10期 - Scholar's Weekly

Scholar's Weekly 第10期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

关键词: EventcommanderWebComponentsstructura

1. You’ve Got Options for Removing Event Listeners

相关地址:https://www.macarthur.me/posts/options-for-removing-event-listeners

作者详尽介绍了集中取消事件的方案:

  • 保持相同入参的引用不变,可以取消请求。
    const myCallback = () => {
    +  console.log('clicked!');
    +};
    +
    +document.getElementById('button').addEventListener('click', myCallback);
    +document.getElementById('button').removeEventListener('click', myCallback);
    +
  • 借助 AbortController 取消请求;
    const button = document.getElementById('button');
    +const controller = new AbortController();
    +const { signal } = controller;
    +
    +button.addEventListener('click', () => console.log('clicked!'), { signal });
    +
    +// Remove the listener!
    +controller.abort();
    +

不得不说第二种方案真的蛮令人耳目一新的~

2. commander.js V10 发布

相关地址:https://github.com/tj/commander.js/releases

V10 版本的变化蛮大的,最大的 Break 变更是依赖 Node V14 及更高的版本。

3.一个免费的 WebComponents 指引教程

相关地址:https://htmlwithsuperpowers.netlify.app/

如果想要了解 WebComponents 相关的知识,是一个不错的选择。

4. 借助 asynctype='module' 阻止 css 阻塞 js 的加载

相关地址: https://calendar.perfplanet.com/2022/using-inline-javascript-modules-to-prevent-css-blockage

<script type="module" async>
+    // todo some js code
+</script>
+

waw! 最佳实践......

5. lib 不可变数据结构 structura.js

相关地址:https://giusepperaso.github.io/structura.js

在这些情况下使用 Sructura 而不是 Immer:

  • 性能对您很重要
  • 不可变状态正在成为您应用程序中的瓶颈
  • 您必须处理的状态在无服务器功能或云中可能非常巨大和复杂,因为您希望尽可能减少使用的资源循环并且您的状态中可能存在多个引用,所以您不希望限制生产者的返回类型修改草稿并返回它的一部分在需要同一个生产者的情况下
  • 您不想考虑启用/禁用功能
  • 您可能需要也可能不需要分叉库来使其适应您的用例,因为代码很小,很容易推理

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-10 19:20:05
创建日期: 2023-02-10 19:20:05
\ No newline at end of file diff --git a/docs/2023/02/11/index.html b/docs/2023/02/11/index.html new file mode 100644 index 0000000..b90ee1f --- /dev/null +++ b/docs/2023/02/11/index.html @@ -0,0 +1,71 @@ + 第11期 - Scholar's Weekly

Scholar's Weekly 第11期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: AppSingleReactDepngnRemix

1. 使用 AppSingle 监控您的 Nest 应用程序

相关地址:https://blog.appsignal.com/2023/01/30/monitoring-your-nestjs-application-with-appsignal.html

重要的一点先声明:

  • 收费
  • 服务器在荷兰

特性(卖点):

其实我个人更推荐 skywalking,开源、强大、自部署。

2. React 10周年纪录片

相关地址:https://www.youtube.com/watch?v=8pDqJVdNa44

因为在油管,但是我也简单自费上传到了自己的 OSS,可以自行食用。

3. Depngn

相关地址:https://github.com/upgradejs/depngn

检测 package.json 中的依赖项是否满足当前的 node 版本,核心原理主要是检测依赖项包字段:engine

4. Remix: 全栈开发的领导者

相关地址:https://www.infoworld.com/article/3687210/intro-to-remix-a-leader-in-full-stack-evolution.html#jump

Next 相比于 Remix 最大的不同是,RemixReact 解耦,可以集成 solidsvlete 等其它框架。


FAQ

1. 如何解决前端中常见的竞态问题

相关地址:https://juejin.cn/post/7128205011019890695

两个的方案

  • axioscancelToken 取消请求
  • RxJsswitchMap

2. 使用 rollup 更优雅的使用 webWorker

相关地址:https://justinribeiro.com/chronicle/2020/07/17/building-module-web-workers-for-cross-browser-compatibility-with-rollup/

  • Blob URL 作为 Worker() 的内参

3. 记一次 position: sticky 失效的问题排查

相关地址:https://www.cnblogs.com/coco1s/p/14180476.html

  • 我所遇到的原因中正好命中了父容器设置了 overflow: hidden,但是我这里用了 overflow-x: hidden 同样也会失效。

4. 记如何下载 youtube 视频

  • 借助:https://en.savefrom.net/ 轻松搞定~

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-17 20:40:01
创建日期: 2023-02-17 20:40:01
\ No newline at end of file diff --git a/docs/2023/02/12/index.html b/docs/2023/02/12/index.html new file mode 100644 index 0000000..d8b2a96 --- /dev/null +++ b/docs/2023/02/12/index.html @@ -0,0 +1,72 @@ + 第12期 - Scholar's Weekly

Scholar's Weekly 第12期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: PerformanceMapDOMPurifyJSON

1. a = 0-x is about 3-10x faster than a = -x

相关地址:https://twitter.com/mhevery/status/1626002464469323777

原因:VM 对于浮点数处理比较慢。

可以观测下相同基准下的性能测试。

2. 多用 Map 少用 Object

相关地址:https://www.builder.io/blog/maps

在频繁增删的操作场景中,Map 的性能会更加优越于 Object

3. 像 JSON.stringify 一样序列化/反序列化对象/字符串

相关地址:https://github.com/Rich-Harris/devalue

  • 循环引用 ( obj.self = obj)
  • 重复引用 ( [value, value])
  • undefined, Infinity, NaN,-0
  • 常用表达
  • 日期
  • MapSet
  • BigInt
  • 通过 replacersreducersrevivers 自定义类型

4. DOMPurify 3.0

相关地址:https://github.com/cure53/DOMPurify/releases

一个有着 9 年历史的处理 html 或者 svg 的工具,快速的预防 XSS 漏洞。

刚刚发布了 3.0 版本,彻底取消对 IE 的支持。


FAQ

1. 对于 process.kill()SIGTERMSIGKILL 最推荐用谁

相关地址:https://www.linuxrumen.com/cyml/1667.html

最近在处理子进程相关的内容,对于信号的传递存有疑问,最终调研得到的最佳方式是默认,什么都不传就是 SIGTERM

SIGKILL 容易制造出僵尸🧟进程,因为进程如果卡死,但是又收到了 kill 命令,那么会一直常驻在内存中,成为🧟进程。

2. The inferred type of "X" cannot be named without a reference to "Y".

相关地址:https://github.com/microsoft/TypeScript/issues/42873

pnpm 项目中莫名出现标题报错。

tsconfig.json 中添加:

"preserveSymlinks": true
+

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-02-24 21:39:09
创建日期: 2023-02-24 21:23:20
\ No newline at end of file diff --git a/docs/2023/03/13/index.html b/docs/2023/03/13/index.html new file mode 100644 index 0000000..1c59f61 --- /dev/null +++ b/docs/2023/03/13/index.html @@ -0,0 +1,71 @@ + 第13期 - Scholar's Weekly

Scholar's Weekly 第13期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: RTLPnpmAtomPrerender

1.Migrating RTL---By Sentry

相关地址:https://blog.sentry.io/2023/02/23/sentrys-frontend-tests-migrating-from-enzyme-to-react-testing-library/

Sentry 团队,结合自身产品,阐述了从 Enzyme 迁移 RTL 的诸多受益:本特点不再提供中文翻译

  • Enzyme has no plans to support React 18. Where RTL does not rely on React’s internals. and would continue to work the same with React 18 as it did with 16 and 17. (note: there is an unofficial adapter for React 18, but it is not actual, full support).
  • Enzyme had only basic support for testing React Hooks.
  • An adapter for our tests to work with React would no longer be needed.
  • RTL does better accessibility tests by providing role-based selectors.
  • RTL avoids some of the pitfalls we ran into with Enzyme like not unmounting components between tests (slow) and directly modifying component state (poor test hygiene).
  • RTL is now the more popular choice on npm for testing React components, likely because enzyme doesn’t directly support the latest version of React.

2.Pnpm 7.29.0

相关地址:https://github.com/pnpm/pnpm/releases/tag/v7.29.0-0

支持了 dedupe-peer-dependents,可以按项目适度开启: - 要求版本相同,则开启,比如 reactreact-dom。 - 要求版本不同,则关闭。

3.使用已建立的 UI 模式模块化 React 应用程序

相关地址:https://martinfowler.com/articles/modularizing-react-apps.html

分层前端的合理性再次被证实,也是笔者一直以来坚持✊的写法,将页面原子化,细化到每一个组件。

4.Prerender pages in Chrome for instant page navigations

相关地址:https://developer.chrome.com/blog/prerender-pages/

一种新的完整的预渲染机制NoState Prefetch 即将取代 rel=prerender。可以暂时关注下,但是现阶段貌似意义不大。


FAQ

相关地址:https://github.com/gcoro/react-qrcode-logo

最近正好用到这种定制化 QR.Code 生成工具。

2.Sonner

相关地址:https://github.com/emilkowalski/sonner

美而舒适的 `Toast`` 组件~

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-03-03 20:28:54
创建日期: 2023-03-03 20:28:54
\ No newline at end of file diff --git a/docs/2023/03/14/index.html b/docs/2023/03/14/index.html new file mode 100644 index 0000000..2877192 --- /dev/null +++ b/docs/2023/03/14/index.html @@ -0,0 +1,79 @@ + 第14期 - Scholar's Weekly

Scholar's Weekly 第14期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: FinalizationRegistryGCSITE GENERATORpronounsToolbox

1.FinalizationRegistry

相关地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry


透过使用 JavaScript 垃圾收集器进行实验这篇文章,了解了一个新的 FinalizationRegistry 类,以编程方式进行检测对象何时被垃圾收集。它适用于所有主要的 web 浏览器和 Node.js

2.THE JAVASCRIPT SITE GENERATOR REVIEW, 2023

相关地址:https://www.zachleat.com/web/site-generator-review/

  • Astro 2.0.15
  • Eleventy 2.0.0
  • Enhance 1.4.6 (added 27 February 2023)
  • Gatsby 5.7.0
  • Next.js 13.2.1
  • Nuxt 3.2.2
  • Remix 1.13.0
  • SvelteKit 1.8.3

以上是一些静态站点生成器,作者分别从 install timesclient bundle sizenode_modules weightnpm auditing 等几个角度进行了工具对比。

3.Add pronouns to your GitHub profile

相关地址:https://github.blog/changelog/2023-03-01-add-pronouns-to-your-github-profile/

Github 支持设置 代词 了,英文中可以用代词 theyherhe ,中文中我理解就比较随意了,可以是自己或者朋友比较认同的代词。

例如:夫子......

4.Nodejs Toolbox

相关地址:https://nodejstoolbox.com/)

一个新的,对于 node 下运行的各种工具的分类汇总,大概看了下,其实不是很全,但是支持提 PR

5.2023年 JavaScript新趋势

相关地址:https://www.jamesqquick.com/blog/javascript-trends-2023/

大体上是建议,尽可能的少用 JS ,比如 TS、比如 denobun 运行时等等。


FAQ

1. Ts-Reset

相关地址:https://github.com/total-typescript/ts-reset

一个类似 CSS Reset 的工具。

TypeScript内置的类型定义并不完美。ts-reset可以让它们变得更好。

Good Job!

2. 如何突破浏览器限制,设置小于 12px 的字号?

.parent {
+    font-size: 12px;
+    .child {
+        font-size: 11px; // want set
+        transform: scale(11/12);
+        transform-origin: left center; // important,目的是居左垂直居中
+    }
+}
+

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-03-11 00:03:06
创建日期: 2023-03-10 23:55:53
\ No newline at end of file diff --git a/docs/2023/03/15/index.html b/docs/2023/03/15/index.html new file mode 100644 index 0000000..1f75ea3 --- /dev/null +++ b/docs/2023/03/15/index.html @@ -0,0 +1,75 @@ + 第15期 - Scholar's Weekly

Scholar's Weekly 第15期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: typescriptwatchreact

1. TypeScript 5.0

相关地址:https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/

TypeScript 5.0 正式发布:

功能速览:

  • Decorators
  • const Type Parameters
  • Supporting Multiple Configuration Files in extends
  • All enums Are Union enums
  • --moduleResolution bundler
  • Resolution Customization Flags
  • --verbatimModuleSyntax
  • Support for export type *
  • @satisfies Support in JSDoc
  • @overload Support in JSDoc
  • Passing Emit-Specific Flags Under --build
  • Case-Insensitive Import Sorting in Editors
  • Exhaustive switch/case Completions
  • Speed, Memory, and Package Size Optimizations
  • Breaking Changes and Deprecations

2. turbowatch

相关地址:https://github.com/gajus/turbowatch

一个新的有意思的工具 turbowatch,它是用于监听指定的文件变化,重启服务的。

通常在 cli 工具开发中很有用。同类的还有 nodemon

当然,如果想实现一个自定义的可以借助:chokidar。具体细节可以参考:建立你自己的 nodemon

3. React 的未来

相关地址:https://changelog.com/jsparty/267

看起来最终的结果导向的是 server ,也就是 ssrssr component

4. 20个TypeScript开发的最佳实践

相关地址:https://itnext.io/mastering-typescript-21-best-practices-for-improved-code-quality-2f7615e1fdc3


FAQ

1. IOS 不兼容的 CSS 属性

主要的问题就是,上下滚动,再次滚动上去,背景图片会丢失。

body {
+    background-image: url("xxx");
+    background-attachment: fixed; // ios 设备不兼容,注意避坑
+}
+

2. driver.jsiphone 14 pro 机型会定位错位。

解决办法就是:手撸一个引导组件。

大概思路:借助 z-index 层级关系。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-03-19 21:52:22
创建日期: 2023-03-19 21:52:22
\ No newline at end of file diff --git a/docs/2023/03/16/index.html b/docs/2023/03/16/index.html new file mode 100644 index 0000000..a56b69d --- /dev/null +++ b/docs/2023/03/16/index.html @@ -0,0 +1,86 @@ + 第16期 - Scholar's Weekly

Scholar's Weekly 第16期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: ReactGTPT4bunastro

1.How to start a React Project in 2023

相关地址:https://www.robinwieruch.de/react-starter/

关于在 2023 年如何开始 React 项目,作者对于基础的开发者的建议是,从 vite + react 开始,因为它底层更快(esbuild)。

但是作为 Vue 的核心支持者,React 并不是第一优先级,所以就意味着,SRC 服务端渲染组件成为了一种 奢望

2.前端工程师的"噩耗"?

相信 GPT4 为一部分人,包括我在内的带来了一些震撼,但是就像从业务、工程角度而言,从生产的严谨性上看,AI 取代人类几乎是不可能的,唯一的结论就是 增强

3.ts-node迁移到bun

相关地址:https://johnnyreilly.com/migrating-from-ts-node-to-bun

4.Astro.js 指南

相关地址:https://bejamas.io/blog/practical-guide-to-astro-js-framework

5.6个前端开发者应该知道的CSS片段

相关地址:https://web.dev/6-css-snippets-every-front-end-developer-should-know-in-2023/

6.eslint-formatter-pretty

相关地址:https://github.com/sindresorhus/eslint-formatter-pretty

更加精美的 eslint 输出,支持 iterm

module.exports = {
+    entry: ['file.js'],
+    module: {
+        rules: [
+            {
+                test: /\.js$/,
+                exclude: /node_modules/,
+                loader: 'eslint-loader',
+                options: {
+                    formatter: require('eslint-formatter-pretty')
+                }
+            }
+        ]
+    }
+};
+

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-03-26 21:21:14
创建日期: 2023-03-26 21:21:14
\ No newline at end of file diff --git a/docs/2023/04/17/index.html b/docs/2023/04/17/index.html new file mode 100644 index 0000000..ee39ffc --- /dev/null +++ b/docs/2023/04/17/index.html @@ -0,0 +1,90 @@ + 第17期 - Scholar's Weekly

Scholar's Weekly 第17期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: importmapauthnpkillreact

1. JavaScript Import Maps 支持跨浏览器

<script type="importmap">
+    {
+        "imports": {
+        "browser-fs-access": "https://unpkg.com/browser-fs-access@0.33.0/dist/index.modern.js"
+    }
+    }
+</script>
+
<button>Select a text file</button>
+<script type="module">
+  import {fileOpen} from 'browser-fs-access';
+
+  const button = document.querySelector('button');
+  button.addEventListener('click', async () => {
+    const file = await fileOpen({
+      mimeTypes: ['text/plain'],
+    });
+    console.log(await file.text());
+  });
+</script>
+

2.在React中实现登录授权认证

3.npkill

新的版本中,性能再次提升,开启了 8核 提速。

4.代码高亮显示工具

5.一些 React 初学者经常会出现的错误

一些常见的问题,可以在测试环境就发现的,但是这也是一种编程习惯,能在编码阶段解决也是一种蜕变。

......

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-04-04 20:26:34
创建日期: 2023-04-04 20:26:34
\ No newline at end of file diff --git a/docs/2023/04/18/index.html b/docs/2023/04/18/index.html new file mode 100644 index 0000000..a678f40 --- /dev/null +++ b/docs/2023/04/18/index.html @@ -0,0 +1,87 @@ + 第18期 - Scholar's Weekly

Scholar's Weekly 第18期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: magicastCronerlazyrepoJSPMchrome extension

1.Croner

相关地址:https://github.com/hexagon/croner

cronnodebundenobrowser 端的实现。

以下是一个快速示例,作为定位 job 的执行,是相当有用的工具。

// Basic: Run a function at the interval defined by a cron expression
+const job = Cron('*/5 * * * * *', () => {
+    console.log('This will run every fifth second');
+});
+
+// Enumeration: What dates do the next 100 sundays occur on?
+const nextSundays = Cron('0 0 0 * * 7').nextRuns(100);
+console.log(nextSundays);
+
+// Days left to a specific date
+const msLeft = Cron('59 59 23 24 DEC *').nextRun() - new Date();
+console.log(Math.floor(msLeft/1000/3600/24) + " days left to next christmas eve");
+
+// Run a function at a specific date/time using a non-local timezone (time is ISO 8601 local time)
+// This will run 2024-01-23 00:00:00 according to the time in Asia/Kolkata
+Cron('2024-01-23T00:00:00', { timezone: 'Asia/Kolkata' }, () => { console.log('Yay!') });
+

2. magicast

相关地址:https://github.com/unjs/magicast

一个超级有用的 语法树 快捷操作工具,可以像写 js 一样操作语法树。

3. lazyrepo

相关地址:https://github.com/ds300/lazyrepo

自从 nx.jsturborepo 提出了 cache build 之后。

lazyrepo 的作者,做了纯功能迁出,目前还是 build 阶段,看起来不错,比较独立,独立于任意一种框架,有点类似于 lerna-litlerna 孵化出的最小集合。

4. 超过100多种数据结构和算法的仓库

相关地址:https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md

之前我有关注过,但是这次我做了一个记录,我觉得作为 数据结构与算法 的探索者,应该要深入源码级别看一看一些好的案例是怎么写的。

5. Netlify 上的框架流行度

相关地址:https://www.netlify.com/blog/framework-popularity-on-netlify/

其实结果已经很明显了,从 20202022 的框架流行度上,基于 React 的,或者说为 React 所服务的框架中,next 的热度在持续上涨。

6.什么是 source map

相关地址:https://developer.chrome.com/en/blog/devtools-tips-23

来自 Google Chrome 的作者的分享。

顺带分享以下 source map 和 source code 的映射工具.

相关地址:https://sokra.github.io/source-map-visualization/

7.JSPM 重新启动

相关地址:https://jspm.org/jspm-cli

在上一周的周刊中,我有介绍到:JavaScript Import Maps 支持跨浏览器

所以在几年前荒废的 jspm 项目得以重启。

8.chrome-extension-cli

相关地址:https://github.com/dutiyesh/chrome-extension-cli

下一代浏览器扩展开发工具的脚手架项目,看起来不错,天然支持了 webpack ,并且作为预设。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-04-10 23:13:53
创建日期: 2023-04-10 23:13:53
\ No newline at end of file diff --git a/docs/2023/04/19/index.html b/docs/2023/04/19/index.html new file mode 100644 index 0000000..716e808 --- /dev/null +++ b/docs/2023/04/19/index.html @@ -0,0 +1,88 @@ + 第19期 - Scholar's Weekly

Scholar's Weekly 第19期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: npmReactES2023NodeViteEnum

1.npm-package-provenance

相关地址:https://github.blog/2023-04-19-introducing-npm-package-provenance

npm 支持了 provenance,用来给某一个包打一个标识,用来表明这个包通过了 CI/CD 的,用于提升包的安全性能。

2.introduction to React

相关地址:https://react.gg/visualized

比较生动形象地介绍 React 所经历的形态:MV -> MVC -> MVVM

以动画形式介绍,状态和 UI 之间流转。

3.ES2023

相关地址:https://pawelgrzybek.com/whats-new-in-ecmascript-2023/

介绍下几个特性:

  • Array.prototype 上新增 findLast & findLastIndex

    const isEven = (number) => number % 2 === 0;
    +const numbers = [1, 2, 3, 4];
    +
    +// from first to the last lookup
    +console.log(numbers.find(isEven));
    +// 2
    +console.log(numbers.findIndex(isEven));
    +// 1
    +
    +// from last to the first lookup
    +console.log(numbers.findLast(isEven));
    +// 4
    +console.log(numbers.findLastIndex(isEven));
    +// 3
    +

  • 编写命令行 CLI 的头文件书写开始规范化

    #!/usr/bin/env node
    +
    +console.log('hi 👋');
    +

  • WeakMap 支持 Symbol 作为它的 key

  • Array 支持了几个有用的不修改原数组的方法
  • toReversed 对标 reverse
  • toSorted 对标 sort
  • toSplice 对标 splice

4.Node V20 Released

相关地址:https://nodejs.org/en/blog/announcements/v20-release-announce

Node 发布了 V20 版本: - 一个实验性的权限模型。这是 Deno 核心的一个功能,但现在你也可以限制 Node 中某些能力的访问。 - V8 11.3(包括正则表达式 /v 标志支持) - node:test 测试运行器稳定了。 - ARM64 上的 Windows 官方支持。 - 单个可执行文件打包机制的改进。

5.Vite so faaaaster

相关地址:https://sun0day.github.io/blog/vite/why-vite4_3-is-faster.html

Vite 发布了 4.3 版本,号称 faaaaaster,这篇文章集中介绍了为了Vite 团队做了什么事情。

6.在 JavaScript 中创建 enum 的四种形式

相关地址:https://dmitripavlutin.com/javascript-enum/

7.Ohash

相关地址:https://github.com/unjs/ohash

超级快的 hash 库,我想用作大对象 hash 后做 diff 一定很快。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-04-23 21:04:37
创建日期: 2023-04-23 20:24:55
\ No newline at end of file diff --git a/docs/2023/05/20/index.html b/docs/2023/05/20/index.html new file mode 100644 index 0000000..3590467 --- /dev/null +++ b/docs/2023/05/20/index.html @@ -0,0 +1,71 @@ + 第20期 - Scholar's Weekly

Scholar's Weekly 第20期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: npmReactconstCSSFUSE

1.不阻塞事件循环的实用指南

相关地址:https://www.bbss.dev/posts/eventloop/

不阻塞事件循环的实用性指导,文章列举了一些列不阻塞事件循环的案例。

2.React 渲染交互指南

相关地址:https://ui.dev/why-react-renders

COMPONENTVIEWSNAPSHOT

3."常量"陷进

相关地址:https://www.joshwcomeau.com/javascript/the-const-deception/

文章核心介绍了 const 修饰值类型引用类型的差异。

4.通过借鉴 JavaScript 函数的思想来编写更好的 CSS

相关地址:https://www.smashingmagazine.com/2023/04/write-better-css-borrow-ideas-javascript-functions/

5.剖析 Npm 恶意软件:五个软件包及其邪恶的安装脚本

相关地址:https://blog.sandworm.dev/dissecting-npm-malware-five-packages-and-their-evil-install-scripts

可以先看一下 npm 包的最佳实践。

6.使用 Fuse.js 进行快速简单的模糊搜索

相关地址:https://spin.atomicobject.com/2023/04/27/fuse-js-fuzzy-search/

大体量的纯前端模糊搜索可以用起来。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-05-08 23:12:26
创建日期: 2023-05-08 23:12:26
\ No newline at end of file diff --git a/docs/2023/05/21/index.html b/docs/2023/05/21/index.html new file mode 100644 index 0000000..dddad2a --- /dev/null +++ b/docs/2023/05/21/index.html @@ -0,0 +1,71 @@ + 第21期 - Scholar's Weekly

Scholar's Weekly 第21期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: ReactRegExpPerformanceESLintKnip

1.React Canaries: Enabling Incremental Feature Rollout Outside Meta

相关地址:https://react.dev/blog/2023/05/03/react-canaries

React 团队推出了金丝雀版本,旨在为想更快体验新功能的用户多一种选择,这些金丝雀版本的功能最终都会被合并进稳定版本。

2.JavaScript 正则表达式

相关地址:https://www.honeybadger.io/blog/javascript-regular-expressions/

JavaScript 正则表达式入门

3.How to measure page loading time with Performance API

相关地址:https://www.silvestar.codes/articles/how-to-measure-page-loading-time-with-performance-api/

4.Configuring ESLint, Prettier, and TypeScript Together

相关地址:https://blog.joshuakgoldberg.com/configuring-eslint-prettier-and-typescript-together/

文章主要讲述在 React 中如何同时配置 eslintprettiertypescript

5.Knip

相关地址;https://github.com/webpro/knip

一个新的找到项目中未使用的依赖的工具,同等工具还有:npm-checkdepcheck......

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-05-15 23:10:30
创建日期: 2023-05-15 23:10:30
\ No newline at end of file diff --git a/docs/2023/05/22/index.html b/docs/2023/05/22/index.html new file mode 100644 index 0000000..fb2f7ea --- /dev/null +++ b/docs/2023/05/22/index.html @@ -0,0 +1,105 @@ + 第22期 - Scholar's Weekly

Scholar's Weekly 第22期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: BunDeopt ExplorerPromise.withResolversUnit TestJest

1.Bun new bundler

相关地址:https://bun.sh/blog/bun-bundler

Bun 有了一个原生的打包工具,经过基准测试后的速度,Unbelievable,so cool...

此外还有一个更酷的内容:

2.Using Bun.js as a bundler

相关地址:https://shaneosullivan.wordpress.com/2023/05/17/using-bun-js-as-a-bundler

刚好作为承接第一条周刊的内容,作为一个使用者的感受,Shane O'Sullivan 有了自己的心得体会,包括对于 vercel 上构建内容的一些坑点。

em,教科书式指导。

3.Deopt Explorer 简介

相关地址:https://devblogs.microsoft.com/typescript/introducing-deopt-explorer/

Deopt Explorer 的工具来帮助我们探索 V8 在编译器执行时产生的各种反优化、IC 和对象类型。

举个例子,插件可以查看函数的状态信息。

4.Promise.withResolvers

相关地址:https://github.com/tc39/proposal-promise-with-resolvers

通常大家是如何处理顶层的 new Promiserejresolve 函数的呢?

const handler = (callback) => new Promise(
+    (res, rej) => {
+        callback(res, rej);
+    }
+);
+
+handler((res, rej) => {
+    if(true) {
+        res(); // do right something
+    } else {
+        rej(); // do reject
+    }
+})
+

现在有了 Promise.withResolvers 可以很好的缓解这个状态,它有点像是 React Context,按照规范特性的描述:

On subclasses of Promise, the withResolvers method should produce instances of the subclass.

那么我们可以改造下,像是下面这种:

const handler = (callback) => new Promise(
+    (res, rej) => {
+        callback();
+    }
+);
+
+handler(() => {
+    const { reject, resolve, promise } = Promise.withResolvers();
+
+    if(true) {
+        resolve(); // do right something
+    } else {
+        reject(); // do reject
+    }
+});
+

so cool!

5.使用纯 JavaScript 获得完整的类型支持

相关地址:https://www.pausly.app/blog/full-type-support-with-plain-javascript

在某种特定场景下,你不必修改 *.js*.ts 获取类型支持,完全可以借助 JSDOC 获取支持。

6.你的 Jest 测试可能是错误的

相关地址:https://jamiemagee.co.uk/blog/your-jest-tests-might-be-wrong/

你的 Jest 套件配置可能有些问题,Magee 向我们展示一组比较好的默认配置,因为一些测试状态可能会发生泄漏,导致我们的测试用例结果可能是错误的: - 正确的用例实际因为状态未重置导致错误,让人产生困惑; - 错误的用例因为状态未重置导致正确,让程序产生“欺骗”;

{
+  clearMocks: true,
+  resetMocks: true,
+  restoreMocks: true,
+  resetModules: true // It depends
+}
+

7.Legend-State

相关地址:https://legendapp.com/open-source/legend-state-v1/

在速度和内存上取得里压制性胜利的一个新的 React State 库,可以看下简单的基准测试:

8.headless-qr

相关地址:https://github.com/Rich-Harris/headless-qr

一个现代化的 QR 生成工具。

9.eslint-plugin-check-file

相关地址:https://github.com/DukeLuo/eslint-plugin-check-file

我猜你肯定听过 引入包排序(simple-import-sort)包管理(eslint-plugin-package-json-dependencies)等插件。

检测文件名,支持完全受控的文件名,保持项目文件名格式的一致性是一个不错的选择。

周刊中说了太多次 so cool,是因为我最近在看《闪电侠》,“巴里”(作为主人公)很喜欢说的一个词,waw! so cool~~~

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-05-22 00:45:30
创建日期: 2023-05-22 00:45:30
\ No newline at end of file diff --git a/docs/2023/05/23/index.html b/docs/2023/05/23/index.html new file mode 100644 index 0000000..7e3d479 --- /dev/null +++ b/docs/2023/05/23/index.html @@ -0,0 +1,71 @@ + 第23期 - Scholar's Weekly

Scholar's Weekly 第23期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: ArrayIs-LintwebcomponentdynaboardDeviceScript

1.for...offlatMapreduce 的实用性指导

相关地址:https://2ality.com/2022/05/processing-arrays-non-destructively.html

方法 同步 异步方案 改变原数组 提前退出
for...of
flatMap
reduce

2. Is-Lint

相关地址:https://github.com/loeffel-io/ls-lint

文件或者文件名的 Lint 工具,最好的优势“快速”。

3. webcomponent 的实践实例

相关地址:https://blog.rasvi.io/2023-05-21-webcomponent-intro-with-example

具有实用性指导的 webComponent 实践。

4.dynaboard

相关地址:https://dynaboard.com/

dynaboard 免费的 dashboard 的工具,专为开发人员准备。

5.DeviceScript

相关地址:https://microsoft.github.io/devicescript/

DeviceScript 使用 TypeScript 进行物联网设备,新颖且实用。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-05-29 21:38:29
创建日期: 2023-05-29 21:38:29
\ No newline at end of file diff --git a/docs/2023/06/24/index.html b/docs/2023/06/24/index.html new file mode 100644 index 0000000..0c80903 --- /dev/null +++ b/docs/2023/06/24/index.html @@ -0,0 +1,83 @@ + 第24期 - Scholar's Weekly

Scholar's Weekly 第24期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: URLaimlesssharedWorkerReactquic

1.安全的 JavaScript URL 验证

相关地址:https://snyk.io/blog/secure-javascript-url-validation/?utm_campaign=aom_2023&utm_medium=paid-email&utm_source=cooperpress-javascript-weekly&utm_content=secure-javascript-url-validation

当我们在书写 JavaScript 时,大部分场景下对于 URL 的结构检验,单纯的只是靠简单的正则表达式处理,但是冗长的正则表达式既形成了容易出错的端倪,也容易出现执行缓慢的情况(如果你对此抱有质疑,请详细了解正则表达式的性能问题)。

function checkHttpUrl(string) {
+    let givenURL;
+    try {
+        givenURL = new URL(string);
+    } catch (error) {
+        console.log("error is",error)
+      return false;  
+    }
+    return givenURL.protocol === "http:" || givenURL.protocol === "https:";
+  }
+

这里其实是一个简单的示例。

2.aimless.js

相关地址:https://github.com/ChrisCavs/aimless.js#using-custom-prng

在实际业务中,我们可能会有“生成随机数的需求”,可能是简单的写一个函数,但是每次都去写,难免繁琐,可以尝试使用 aimless 解决一些随机数的生成问题:

const intSeq = intSequence(-1, 3)
+// could return [3,-1,2,1,0], [0,2,-1,3,1], etc
+

以上是一个简单的举例,随机生成范围的数字序列。

3.在浏览器选项卡之间共享 websocket 链接

相关地址;https://brightinventions.pl/blog/sharing-websocket-connections-between-browser-tabs-and-windows

按照以往的业务开发方式,我们经常会这么处理 websocket ,一个 tab 一个链接,那么就会导致 ws 层的业务压力,过多的 连接数

这里介绍了一种解决方案: SharedWorker ,用于窗口间的共享,将消息的传递,改为进程中传输。

4.React 是怎么工作的?

相关地址:https://www.youtube.com/watch?v=za2FZ8QCE18

视频在油管上,在你点击观看前,可以先思考以下几个问题,如果你很清楚,那么可以跳过,因为视频并没有深入讲解太多的内容:

  • 为什么 React 不认识 jsx
  • 两颗树直接是如果 diff 的?

5.图解各种协议的流转过程

相关地址:https://cangsdarm.github.io/illustrate/tls13

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-06-05 23:45:37
创建日期: 2023-06-05 23:36:50
\ No newline at end of file diff --git a/docs/2023/06/25/index.html b/docs/2023/06/25/index.html new file mode 100644 index 0000000..cda061c --- /dev/null +++ b/docs/2023/06/25/index.html @@ -0,0 +1,71 @@ + 第25期 - Scholar's Weekly

Scholar's Weekly 第25期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: wasmTypescriptRSCJSbundle.js

1.一个在浏览器端的 wasm polyfill

相关地址:https://github.com/evanw/polywasm

大致背景: - Apple 的锁定模式会在 safari 中禁用 WebAssemblypolyfill 使得在这种情况下让运行成为可能。 - 作者认为他从中学到了很多新的东西。

2.TypeScript 5.1 发布

相关地址:https://devblogs.microsoft.com/typescript/announcing-typescript-5-1/

功能点:

其中我觉得重大变化是大家需要关注的点,就是 TypeScript 5.1 默认要求 Node 版本必须在 14.17 以上了。

3.RSC 从零开始

相关地址:https://github.com/reactwg/server-components/discussions/5

Dan 写了一个从零开始 服务端组件 的教程,旨在为哪些想研究服务器组件背后思想的人来一次深度思考和学习。

4.The many ways to select the n-th character from a string.

相关地址:https://christianheilmann.com/2023/06/02/the-many-ways-to-select-the-n-th-character-from-a-string/

选择一个字符串中的第 n 个字符的许多种方法:

5.ESLint Plugin Perfectionist

相关地址:https://github.com/azat-io/eslint-plugin-perfectionist

排序一些常见的内容:sorting various data, such as objects, imports, TypeScript types, enums, JSX props, etc.

动机:美学、可维护性、一致性、可读性

6.bundle.js

相关地址:https://blog.okikio.dev/documenting-an-online-bundler-bundlejs

基于 Esbuild 的在线打包器,支持在线输出打包分析。

官方给出的能力或者好处有下面这些:

  • 更容易调试错误
  • 可以验证生成的捆绑代码
  • 配置捆绑包的能力
  • tree shaking 捆绑包的能力
  • 能够查看捆绑包的可视化分析
  • 支持来自不同内容交付网络 (CDN)的不同类型的模块,例如从 deno 模块到 npm 模块到随机 github 脚本等的 CDN...

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-06-11 20:07:24
创建日期: 2023-06-11 20:07:24
\ No newline at end of file diff --git a/docs/2023/06/26/index.html b/docs/2023/06/26/index.html new file mode 100644 index 0000000..07a794c --- /dev/null +++ b/docs/2023/06/26/index.html @@ -0,0 +1,71 @@ + 第26期 - Scholar's Weekly

Scholar's Weekly 第26期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: gistschrome for testingnpmTypeScript

1.github gists 跑在 aws lambda,那一定很有趣

相关地址:https://www.val.town/

serverless 想来大家一定并不陌生,(简单定义:给定函数在云上跑,给一个输入,吐一个输出出来),作者在文中想阐述的意思也是这个。

聊到 serverless ,其实突然想到了 ssrssr,宇昂大佬写的,号称地表最强 ssr 框架,提供了 serverless 能力,如果你还不清楚什么是 serverless,我推荐阅读 跟狼叔聊了一夜,终于搞明白了 Serverless 是什么?

2.chrome-for-testing

相关地址:https://developer.chrome.com/blog/chrome-for-testing

大致内容:chrome 发布了一个可以专门用来测试的浏览器版本,chrome test

大白话来说,10 年后,你仍旧可以获得现在的 chrome 二进制文件,这个信息意味着未来低版本浏览器的测试可行性极大的在提高。

根据 MDN 2021年 报告,跨浏览器版本测试是开发者头疼的一个点。

好了,说完了好消息,那我们接下来传递一个坏消息:

更低版本的浏览器是不支持的,也就是 chrome 113 之前的版本基本不可能。

其实出发点是好的,只是对于现在的开发者似乎意义不是很大,当然对于新的 语言 stage 而言,或许有一些意义。

3.npm 禁止发布 keywords 包含 keygencheat 的包

相关地址:https://news.ycombinator.com/item?id=36325523

当你的 npm 包中包含了 keygen 或者 cheat ,会被禁止发布,大概的讨论在链接中,是一个相对比较有争议的话题。

4.ts-pattern

相关地址:https://github.com/gvergnaud/ts-pattern#Pinfer

用于写出高阶 ts 类型的辅助工具库,更简短的语句实现更复杂的类型声明。

(: 本周只有四条,不是敷衍,是没有什么优质新闻~

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-06-24 20:24:19
创建日期: 2023-06-20 00:47:02
\ No newline at end of file diff --git a/docs/2023/06/27/index.html b/docs/2023/06/27/index.html new file mode 100644 index 0000000..b67f6d3 --- /dev/null +++ b/docs/2023/06/27/index.html @@ -0,0 +1,85 @@ + 第27期 - Scholar's Weekly

Scholar's Weekly 第27期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: unsuckjs.comTypeScriptEvent LoopCSS In JS

1.unsuckjs.com

相关地址:https://github.com/adamghill/unsuckjs.com

使用轻量级 JavaScript 库逐步增强 HTML

更多的有些类似:awesome,但是添加了一些横向对比参照。

2.TypeScript 5.2 的新关键字:“using”

相关地址:https://www.totaltypescript.com/typescript-5-2-new-keyword-using

TypeScript 5.2 中即将新迎来一个关键字:using当函数离开作用域时,您可以使用它来处理任何内容。 这就是主要的能力。

import { open } from "node:fs/promises";
+const getFileHandle = async (path: string) => {
+  const filehandle = await open(path, "r");
+  return {
+    filehandle,
+    [Symbol.asyncDispose]: async () => {
+      await filehandle.close();
+    },
+  };
+};
+{
+  await using file = getFileHandle("thefile.txt");
+  // Do stuff with file.filehandle
+} // Automatically disposed!
+

如上所述,我们不必在 try...finally 中去释放资源,更多的动机详见:ECMAScript 显式资源管理

3.可视化的形式了解 Node.js 事件循环完整指南

相关地址;https://www.builder.io/blog/visual-guide-to-nodejs-event-loop#conclusion

共计 7 个系列,推荐阅读:

4.toad-scheduler

相关地址:https://github.com/kibertoad/toad-scheduler

内存中的TypeScript作业调度器,在指定的时间间隔内重复执行给定的任务(例如,"每20秒")。如果你需要的话,也支持Cron语法。

5.tesseract.js 4.1.1 发布

相关地址:https://github.com/naptha/tesseract.js/releases/tag/v4.1.1

修复了处理使用 iOS 设备拍摄图像的关键错误。

6.Panda CSS

相关地址:https://panda-css.com/docs/why-panda#the-new-era-of-css-in-js

社区已经有很多 CSS In JS 的方案和库了,但是在 chakra ui 背后的光环人物,带着一个新的解决方案出现了;

动机:

  • 消除糟糕的运行时开销;
  • 以支持 SRCSSR 作为主要动机;

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-06-24 20:24:19
创建日期: 2023-06-24 20:24:19
\ No newline at end of file diff --git a/docs/2023/07/28/index.html b/docs/2023/07/28/index.html new file mode 100644 index 0000000..56b2791 --- /dev/null +++ b/docs/2023/07/28/index.html @@ -0,0 +1,72 @@ + 第28期 - Scholar's Weekly

Scholar's Weekly 第28期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~

FE News

关键词: JavaScriptTypeScriptCommonJSstartViewTransition

1.JavaScript的下一步是什么: 期待的新功能

大体计划会偏向于:

  • 不会将 JavaScript 转换为 TypeScript
  • 原生 JS 支持国际化

2.超越浏览器:JavaScript 标准的长期未来

内卷的开端从哪里呢?

  • 跨越浏览器的 Runtime
  • 异步上下文

3.CommonJS 正在损害 JavaScript

我觉得标题或多或少有些哗众取宠了,因为只是一个时代的过渡品,何况 Node 14.8 之后已经支持了 ES 模块,我们不应该否认 CommonJs 在低版本浏览器或者 UMD 思想中所做出的贡献。

4.去除图片背景,你是怎么做的呢?

$ npm install @imgly/background-removal
+

借助算法,在浏览器端使用 JavaScript 移除图像背景。

5.解读 DOMContentLoaded

你知道 DOMContentLoaded 的执行时机吗?

More accurately, DOMContentLoaded signifies that all blocking and defer and type=module code has finished running

6.视图转换 API 简介

startViewTransition 浏览器视图过渡转换 API 介绍。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-07-09 23:58:07
创建日期: 2023-07-09 23:58:07
\ No newline at end of file diff --git a/docs/2023/08/29/index.html b/docs/2023/08/29/index.html new file mode 100644 index 0000000..4013cce --- /dev/null +++ b/docs/2023/08/29/index.html @@ -0,0 +1,71 @@ + 第29期 - Scholar's Weekly

Scholar's Weekly 第29期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部->阅读原文🫶


关键词: htmlxwebJSXEventListener

FE News

1.htmlx 成为 GitHub 加速器的一部分

相关地址:https://htmx.org

  • 动机:纯 html 发请求、调用事件......

2.2023 年的 10 个 web 趋势

相关地址:https://www.robinwieruch.de/web-development-trends/

  • 渲染模式:从 CSR -> SSR -> SSG
  • 边缘服务器:ServerlessAWSCloudfire
  • JavaScript 运行时Deno
  • MonorepoTurborepo
  • CSSTailwind CSS
  • 类型安全:TypeScript
  • 构建工具:webpack -> vite
  • AI IDEGitHub Copilot
  • 桌面应用框架:Electron -> Tauri
  • E2E测试:Cypress -> Playwright
  • ShellIterm -> Warp & Fig

3.JSX without React

相关地址:https://chriscoyier.net/2023/08/07/jsx-without-react/

没有完整的 React 框架程序,你一样可以渲染 JSX

动机:SSG

或许在 SSG 应用中可以尝试。

4.几种删除事件监听的方案

相关地址:https://www.macarthur.me/posts/options-for-removing-event-listeners

  • removeEventListener
  • addOnce
  • Cloning & Replacing the Node
  • AbortController

5.因为 React,你所忘记的一些事

相关地址:https://joshcollinsworth.com/blog/antiquated-react

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-08-29 00:42:49
创建日期: 2023-08-29 00:42:49
\ No newline at end of file diff --git a/docs/2023/09/30/index.html b/docs/2023/09/30/index.html new file mode 100644 index 0000000..3251932 --- /dev/null +++ b/docs/2023/09/30/index.html @@ -0,0 +1,71 @@ + 第30期 - Scholar's Weekly

Scholar's Weekly 第30期

(封面图片来源于:基于 CC0 协议的 stocksnap)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部->阅读原文🫶


关键词: TypeScriptOpticsReact EmailAnimation

FE News

1.React 官方出的 TypeScript 教程

相关地址:https://react.dev/learn/typescript

难得一见官方如此良心,对于即将学习 React 新手来说,是个不错的指引。

2.Comparing Optics with Jotai

相关地址:https://unfocused.blog/posts/comparing-optics-with-jotai

Optics 一个新的、函数式编程的状态管理库,文章作者主要就共性与 jotai 做了对比。

(:话说我正在苦恼,怎么把 recoil 切到 jotai,正在研究钩子复写替换。

3.使用 React Email 创建电子邮件模版

相关地址:https://spacejelly.dev/posts/create-email-templates-with-react-js-using-react-email/

工具: - Resend - React Email

给自己记一个待办,周末的一定要玩一玩,搭建一个域名为:email.bigdreamer.cc 或者 email.binlin.wang 的小破站。

4.一个创建动画的辅助工具

可以从里面设计好动画,直接 copy 出:CSSSCSSSwiftObj-C

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2023-09-04 23:11:45
创建日期: 2023-09-04 23:11:45
\ No newline at end of file diff --git a/docs/2024/01/31/index.html b/docs/2024/01/31/index.html new file mode 100644 index 0000000..f946741 --- /dev/null +++ b/docs/2024/01/31/index.html @@ -0,0 +1,78 @@ + 第31期 - Scholar's Weekly

Scholar's Weekly 第31期

(封面图片来源于:基于 CC0 协议的 pixabay)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: ReactdeepClonestyleXCss-In-Js

FE News

1.现代化深克隆

相关地址:https://www.builder.io/blog/structured-clone

现代化的克隆方式:

浏览器基线,现代化的浏览器基本都得到了支持,并且在 Web Worker 中可用。

const atom = {
+    year: '2024',
+    helloMsg: '新年快乐',
+    date: new Date(),
+}
+
+const cloneAtom = structuredClone(atom);
+

什么不能克隆

  • 函数
  • DOM 节点
  • 属性描述符:getter、setter
  • 对象原型

2.WebComponent 将比任何 JS 框架都长寿

相关地址:https://jakelazaroff.com/words/web-components-will-outlive-your-javascript-framework/

其实我是认同的,这个观点比较鲜明,跨框架生态的组件形式还是可以的,借助影子 DOM 具备天然的沙箱系统。

作者在原文中举了很多示例,还是比较有意思的。

3.StyleX

相关地址:https://stylexjs.com/blog/introducing-stylex/

Meta 开发的一个新的 CSS-IN-JS 的库。

  • 编译时和运行时都很快;
  • 小化 CSS 产物的体积;
  • 防止冲突;
  • Tree-Shaking

4.优化 React 中的重复渲染

相关地址:https://blog.sentry.io/fixing-memoization-breaking-re-renders-in-react/?utm_source=reactstatus&utm_medium=paid-community&utm_campaign=general-fy24q4-jtbd&utm_content=newsletter-jtbdblog-read

内容有些简陋,就是简单的介绍了 useCallbackmemo 来优化组件。

5.React 中多态性(2种模式)

相关地址:https://www.bekk.christmas/post/2023/1/polymorphism-in-react

内容也很简陋,有兴趣可以读一读: - Button 作为展示元素 - Button 作为 Parent 具备插槽能力

但是我觉得文章中的 asChild 有些多余,重新写一个组件不就好了,保持组件的单一功能原则。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-01-09 00:16:17
创建日期: 2024-01-01 20:24:32
\ No newline at end of file diff --git a/docs/2024/01/32/index.html b/docs/2024/01/32/index.html new file mode 100644 index 0000000..013ab24 --- /dev/null +++ b/docs/2024/01/32/index.html @@ -0,0 +1,110 @@ + 第32期 - Scholar's Weekly

Scholar's Weekly 第32期

(封面图片来源于:基于 CC0 协议的 pixabay)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: JSwithArray

FE News

1.2024 年每个 JavaScript 开发人员都应该知道的 10 个面试问题

相关地址:https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-in-2024-c1044bcb0dfb

  1. 什么是闭包?
  2. 什么是纯函数?
  3. 什么是函数组合?
  4. 什么是函数式编程?
  5. 什么是 Promise?
  6. 什么是TypeScript?
  7. 什么是 Web Component?
  8. 什么是 React Hook?
  9. 如何在 React 中创建点击计数器?
  10. 什么是测试驱动开发(TDD)?

2.让我们回顾一下 JavaScript 的 with() 语句

相关地址:https://macarthur.me/posts/with

作者意图很鲜明,“with” 所带来的风险和挑战被夸大了。(:我保持中立态度

缺点:

  • 严格模式不支持
  • 范围泄漏
  • 性能
with (data) {
+  await saveToDb({
+    imageUrl,
+    width,
+    height,
+  });
+}
+

但是我还是同意把它放在 CLI 程序编写中实现,至于生产代码则不推荐,因为严格模式不支持。

其实 ES6 的结构已经相当优异了。

3.理解毫无意义的 JavaScript 特性

相关地址:https://www.smashingmagazine.com/2023/12/making-sense-of-senseless-javascript-features/

  • 0.1 + 0.2 != 0.3
  • 强制类型转换
  • 1 == true
  • "2" == 2
  • ASI 机制(自动分号插入机制)
  • 基础数据类型太多
  • nullundefinedNaN
  • ++--

虽然确实有些困惑,但是基于历史原因,可以理解和接受,只是需要在日常开发中多家注意。

4.2023年一些新的 javaScript 数组方法

相关地址:https://12daysofweb.dev/2023/new-js-array-methods/

注:以下示例来源于原文

  • toReversed - 不修改原数组的条件下反转数组
const arr = ["Merlin", "Ursula", "Gandalf"];
+
+const reverseArr = arr.toReversed();
+
+// logs ["Gandalf", "Ursula", "Merlin"]
+console.log(reverseArr);
+
+// logs ["Merlin", "Ursula", "Gandalf"]
+console.log(arr);
+
  • toSpliced - 不修改原数组的情况下数组拼接
const wizards = ['Merlin', 'Ursula', 'Gandalf', 'Radagast'];
+
+const lessWizards = wizards.toSpliced(2, 1);
+
+// logs ['Merlin', 'Ursula', 'Gandalf', 'Radagast']
+console.log(wizards);
+
+// logs ['Merlin', 'Ursula', 'Radagast']
+console.log(lessWizards);
+
  • toSorted - 不修改原数组的前提下,进行排序
let sortedWizards = wizards.toSorted();
+
+// logs ['Merlin', 'Ursula', 'Gandalf', 'Radagast']
+console.log(wizards);
+
+// logs ['Gandalf the Gray', 'Merlin', 'Ursula of the Sea']
+console.log(sortedWizards);
+
  • with - 不修改原数组的前提下,进行修改指定索引的数据值
let differentWizards = wizards.with(2, 'Radagast');
+
+// logs ['Merlin', 'Ursula', 'Gandalf']
+console.log(wizards);
+
+// logs ['Merlin', 'Ursula', 'Radagast']
+console.log(differentWizards);
+

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-01-09 00:18:44
创建日期: 2024-01-09 00:16:17
\ No newline at end of file diff --git a/docs/2024/01/33/index.html b/docs/2024/01/33/index.html new file mode 100644 index 0000000..665f35d --- /dev/null +++ b/docs/2024/01/33/index.html @@ -0,0 +1,96 @@ + 第33期 - Scholar's Weekly

Scholar's Weekly 第33期

(封面图片来源于:基于 CC0 协议的 pixabay)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: fsxjsremoteStorage

FE News

1. 每一个 Jser 都应该知道的 33 个概念

相关地址:https://github.com/leonardomso/33-js-concepts?tab=readme-ov-file#-table-of-contents 如图所示,仅列了部分,都是一些比较核心且又基础的概念,可以再温习一遍。

2.fsx

相关地址:https://github.com/humanwhocodes/fsx

一个现代化的 fs 系统:

读文件

// read plain text
+const text = await fsx.text("/path/to/file.txt");
+
+// read JSON
+const json = await fsx.json("/path/to/file.json");
+
+// read bytes
+const bytes = await fsx.arrayBuffer("/path/to/file.png");
+
写文件

// write a string
+await fsx.write("/path/to/file.txt", "Hello world!");
+
+const bytes = new TextEncoder().encode("Hello world!").buffer;
+
+// write a buffer
+await fsx.write("/path/to/file.txt", bytes);
+

检测

if (await fsx.isFile("/path/to/file.txt")) {
+    // handle the file
+}
+

删除

// delete a file
+await fsx.delete("/path/to/file.txt");
+
+// delete a directory
+await fsx.delete("/path/to");
+

我个人使用下来的的感官,比原生的 fs 要好用的多,完全的 Promise 更符合现代编程。

3.drawing.garden

相关地址:https://drawing.garden

一个可以跟随鼠标移动画画的网站,(:说实话,挺无趣的,但是我还比较感兴趣,lol......

我自己潜画了一个“一箭穿心💘”,还行吧(:丑丑的

4.jsondiffpatch

相关地址:https://github.com/benjamine/jsondiffpatch

如果你和我一样在寻找一个 json diff 的库,那么我极力推荐:jsondiffpatch

import * as jsondiffpatch from 'jsondiffpatch';
+const jsondiffpatchInstance = jsondiffpatch.create(options);
+

最强大莫过于 Diff Pretty Output,这点能力是比较好的。

5.remoteStorage

相关地址:https://github.com/FrigadeHQ/remote-storage

为毛我感觉有些鸡肋呢?redis 不香了吗?不过可能作者有自己的动机:

例如,假设您希望向所有新注册产品的用户显示一个欢迎模态框。如果您使用localStorage来跟踪用户是否已经看过此模态框,则每当他们切换设备或浏览器时,用户将继续重复获得这种体验。

uuid 作为实例,扩展多例,支持服务 docker 自部署。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-01-15 00:29:33
创建日期: 2024-01-15 00:29:33
\ No newline at end of file diff --git a/docs/2024/01/34/index.html b/docs/2024/01/34/index.html new file mode 100644 index 0000000..9412b91 --- /dev/null +++ b/docs/2024/01/34/index.html @@ -0,0 +1,172 @@ + 第34期 - Scholar's Weekly

Scholar's Weekly 第34期

(封面图片来源于:基于 CC0 协议的 shopify)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: React LibrarySyntaxAssertCSS

FE News

1.盘点2024年的React库

相关地址:https://www.robinwieruch.de/react-libraries/

下面仅仅是部分内容,全部内容可以点开相关地址查看阅读:

2.Syntax 播客

Yagiz Nizipli 讨论了他贡献的 Node.js 性能改进、优化技术、URL 的复杂性以及支持未来 TypeScript 支持的因素。

如下是播客,全程英文,听力好点的同学可以戳【阅读原文】入耳,微信公粽号不一定可以支持。

Ready To Listen

3.断言的黄金法则

相关地址:https://www.epicweb.dev/the-golden-rule-of-assertions


"当且仅当未满足系统背后的意图时,测试必定失败。"

“黄金法则” 如上,因为早前也接触过单元测试,浅解过 TDDBDD 测试法则,大白话翻译一下这个“法则”,其实很简单,就是「不要过分关注内部实现,一个输入保持一个输出,作为测试执行的大前提」。

4.2024 年每位前端开发者都应知道的 5 个 CSS 代码段

相关地址:https://web.dev/articles/5-css-snippets-every-front-end-developer-should-know-in-2024?hl=zh-cn

  • CSS:has(.potential-beyond-being-a-parent-selector)
    button:has(.icon) {
    +  gap: 1ch;
    +}
    +
    +.card:has(img) {
    +  grid-auto-flow: row;
    +}
    +
  • 创建子网格布局
    body {
    +  display: grid;
    +  grid-template-columns: repeat(auto-fill, minmax(30ch, 1fr));
    +
    +  > article {
    +    display: grid;
    +    grid-row: span 4; 
    +    grid-template-rows: subgrid;
    +  }
    +}
    +
  • 嵌套 CSS 的方式
    .you {
    +  .can-totally-ship-this {
    +    &.if-you-wanted {
    +      /* it's VERY MUCH like SCSS */
    +
    +      &:is(:hover, :focus-visible) {
    +        /* put a bird on it */
    +      }
    +    }
    +  }
    +}
    +
    +.for-theming {
    +  @media (prefers-color-scheme: dark) {
    +    /* you can nest media queries */
    +  }
    +}
    +
    +/* or for theming with [data-theme="dark"] */
    +.button {
    +  background: black;
    +  color: white;
    +
    +  /* nest and do more than just append, flip it and reverse it */
    +  [data-theme="dark"] & {
    +    background: white;
    +    color: black;
    +  }
    +}
    +
  • 让浏览器平衡标题
  • 使用容器查询单元
    .card {
    +  :is(h2,h3) {
    +    font-size: clamp(1.5rem, 5cqi, 4rem);
    +  }
    +
    +  img {
    +    inline-size: 100cqi;
    +
    +    @container (orientation: landscape) {
    +      inline-size: 50cqi;
    +    }
    +  }
    +}
    +

5.一个轻量的性能测试工具

相关地址:https://github.com/tinylibs/tinybench

import { Bench } from 'tinybench';
+
+const bench = new Bench({ time: 100 });
+
+bench
+  .add('faster task', () => {
+    console.log('I am faster')
+  })
+  .add('slower task', async () => {
+    await new Promise(r => setTimeout(r, 1)) // we wait 1ms :)
+    console.log('I am slower')
+  })
+  .todo('unimplemented bench')
+
+await bench.warmup(); // make results more reliable, ref: https://github.com/tinylibs/tinybench/pull/50
+await bench.run();
+
+console.table(bench.table());
+
+// Output:
+// ┌─────────┬───────────────┬──────────┬────────────────────┬───────────┬─────────┐
+// │ (index) │   Task Name   │ ops/sec  │ Average Time (ns)  │  Margin   │ Samples │
+// ├─────────┼───────────────┼──────────┼────────────────────┼───────────┼─────────┤
+// │    0    │ 'faster task' │ '41,621' │ 24025.791819761525 │ '±20.50%' │  4257   │
+// │    1    │ 'slower task' │  '828'   │ 1207382.7838323202 │ '±7.07%'  │   83    │
+// └─────────┴───────────────┴──────────┴────────────────────┴───────────┴─────────┘
+
+console.table(
+  bench.table((task) => {'Task name': task.name})
+);
+
+// Output:
+// ┌─────────┬───────────────────────┐
+// │ (index) │       Task name       │
+// ├─────────┼───────────────────────┤
+// │    0    │ 'unimplemented bench' │
+// └─────────┴───────────────────────┘
+

6.worker-timers

相关地址:https://github.com/chrisguttandin/worker-timers

动机:主线程的 setTimeout 会挂起,可以在 webWorker 中使用。

7.Sutra.js

相关地址:https://github.com/yantra-core/Sutra.js

Tree 数据的管理,性能提升方面不详,但是语法糖挺好,可以在业务上一试。

    let sutra = SUTRA.createSutra();
+    sutra
+      .if('isBoss')
+      .if('isHealthLow')
+      .then('updateEntity', { color: 0xff0000, speed: 5 });
+

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-01-20 04:16:34
创建日期: 2024-01-20 04:16:34
\ No newline at end of file diff --git a/docs/2024/01/35/index.html b/docs/2024/01/35/index.html new file mode 100644 index 0000000..4b4169b --- /dev/null +++ b/docs/2024/01/35/index.html @@ -0,0 +1,74 @@ + 第35期 - Scholar's Weekly

Scholar's Weekly 第35期

(封面图片来源于:基于 CC0 协议的 shopify)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: BunmutativeWeb WorkerReact 18

FE News

1.The Bun Shell

相关地址:https://bun.sh/blog/the-bun-shell

过去由于操作系统的不一致性,windowslinuxmacos 等操作一些一致性的 shell 命令异常困难,我们需要类似的 polyfill 来书写跨平台的 cli 脚本。

bun 作为实验性质的嵌入式语言和解释器,实现了自己的一套的跨平台解决方案,例如:

import { $ } from "bun";
+
+await $`cd .. && rm -rf node_modules/rimraf`;
+

2.mutative

相关地址:https://github.com/unadlib/mutative

immer 之后的又一个 不可变数据 操作库,性能号称比 immer10x

3.workerpool

相关地址:https://github.com/josdejong/workerpool

workerpool 提供了一种创建工作池的简单方法,用于动态卸载计算以及管理专用工作池。workerpool 基本上实现了线程池模式。有一个工作人员池来执行任务。新任务被放入队列中。工作人员一次执行一个任务,完成后从队列中选择一个新任务。可以通过自然的、基于承诺的代理来访问工作人员,就好像它们可以直接在主应用程序中一样。

WorkerpoolNode.jsChromeFirefoxOperaSafariIE10+ 上运行。

4.culorjs

相关地址:https://culorijs.org/

Culori 是一个 JavaScript 颜色库,支持 CSS Colors Level 4 规范中定义的所有格式以及其他颜色空间的转换和操作。它可以处理颜色差异、插值、渐变、混合模式等等。

5.SonarQube 团队升级到 React 18 的经验只谈

相关地址:https://www.sonarsource.com/blog/upgrading-react-18-sonarqube

主要有以下三个问题:

  • 一些 TypeScript 类型发生了变化
  • npx types-react-codemod preset-18 ./src 可以借助:codemod 帮助我们升级
  • React 测试库也必须更新
  • React 18 带来了重大变化

其他更多的信息可以查看文章地址,其实 18 带来的变化还是很显著的,比如 全自动的批量更新更优异的中断式更新

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-01-27 11:00:49
创建日期: 2024-01-27 11:00:49
\ No newline at end of file diff --git a/docs/2024/02/36/index.html b/docs/2024/02/36/index.html new file mode 100644 index 0000000..9e3ff2f --- /dev/null +++ b/docs/2024/02/36/index.html @@ -0,0 +1,89 @@ + 第36期 - Scholar's Weekly

Scholar's Weekly 第36期

(封面图片来源于:基于 CC0 协议的 shopify)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: GraphTypeScriptPackage managerCSS In JS

FE News

1.Cytoscape.js

相关地址:https://js.cytoscape.org/#demos

纯JS编写的功能齐全的图库。

可以绘制以下 demo 类图。

2.TypeScript 5.4 Beta 来临

相关地址:https://devblogs.microsoft.com/typescript/announcing-typescript-5-4-beta/

  • 在最后的赋值之后保留闭包中的缩小范围
  • NoInfer 实用类型
  • Object.groupByMap.groupBy
  • --moduleResolution bundler--module preserve 中对 require() 调用的支持
  • 检查导入属性和断言
  • 添加丢失参数的快速修复方法
  • 即将到来的 5.5 弃用功能
  • 重大变更

3.Pnpm 作者做了一个新的、很友好的基准测试

相关地址:https://pnpm.io/benchmarks

如上图,看起来还是比较中肯的,下面这张图就更直观了:

yarn Pnp 也非常显眼以及优异~

4.NEXT.JS APP ROUTER MIGRATION: THE GOOD, BAD, AND UGLY

相关地址:https://www.flightcontrol.dev/blog/nextjs-app-router-migration-the-good-bad-and-ugly

Next.js 迁移 App Router,一些好的、坏的、丑陋的痛点。

作者的公司直接迁移失败,最终停留在 13.+ 版本,直言更想选择 Remix

说实话我也保留看法,我的博客系统也正在迁移,迁移过程有些沮丧。

5.现代化发布一个包的开始

相关地址:https://advancedweb.hu/modern-javascript-library-starter/

作者介绍了从发布一个包到 CI/CD 的流程,中立的讲还是比较基础的,希望大家有收获。

6.Polished 4.3

相关地址:https://polished.js.org/docs/#installation

这个库是辅助编写 css in js 的样式库,可能大家第一次接触,容我写几个 demo

// Styles as object usage
+const styles = {
+  fontSize: between('20px', '100px', '400px', '1000px'),
+  fontSize: between('20px', '100px')
+}
+
+// styled-components usage
+const div = styled.div`
+  fontSize: ${between('20px', '100px', '400px', '1000px')};
+  fontSize: ${between('20px', '100px')}
+`
+
+// CSS as JS Output
+
+h1: {
+  'fontSize': 'calc(-33.33333333333334px + 13.333333333333334vw)',
+  'fontSize': 'calc(-9.090909090909093px + 9.090909090909092vw)'
+}
+

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-02-05 17:48:58
创建日期: 2024-02-05 17:48:58
\ No newline at end of file diff --git a/docs/2024/02/37/index.html b/docs/2024/02/37/index.html new file mode 100644 index 0000000..516f4a2 --- /dev/null +++ b/docs/2024/02/37/index.html @@ -0,0 +1,123 @@ + 第37期 - Scholar's Weekly

Scholar's Weekly 第37期

(封面图片来源于:基于 CC0 协议的 shopify)


温馨提示

周刊中所有高亮的内容都可以点击到指定内容的链接~


如果您正处在微信公众号,请直接滚动至底部👉阅读原文🫶


关键词: GraphTypeScriptPackage managerCSS In JS

FE News

1.Tempo

相关地址:https://tempo.formkit.com/#introduction

一个受自多个时间处理开源库灵感的新的时间处理库,尽可能的小,比咱们已知的 dayjs还小且支持 tree-shaking

2.Gemini 1.5

相关地址:https://blog.google/technology/ai/google-gemini-next-generation-model-february-2024/#sundar-note

Gemini 1.5 来临了,我已经加入候补了,快来试用吧。

我们可以来看看 Gemini 1.0 pro 的聪明程度,虽然话没那么多,但是强于 GPT 3.5

3.JSR

相关地址:https://jsr.io/waitlist

Deno 团队即将推出的新的 包管理工具

下面是 Hack News 的讨论:

4.Hono 4.0 来临

相关地址:https://hono.dev/

Hono 4.0 来临,号称全栈,我们先浅看以下 SSG

5.JavaScript 集合中包含并集、交集、差集等

相关地址:https://www.sonarsource.com/blog/union-intersection-difference-javascript-sets/

新的提案中囊括了这些方法 unionintersectiondifferencesymmetricDifferenceisSubsetOfisSupersetOfisDisjointFrom.

并集

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
+
+const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);
+
+const allLanguages = frontEndLanguages.union(backEndLanguages);
+
+// => Set {"JavaScript", "HTML", "CSS", "Python", "Java"}
+
交集

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
+
+const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);
+
+const frontAndBackEnd = frontEndLanguages.intersection(backEndLanguages);
+
+// => Set {"JavaScript"} 
+

单一对比相交差异

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
+
+const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);
+
+const onlyFrontEnd = frontEndLanguages.difference(backEndLanguages);
+
+// => Set {"HTML", "CSS"} 
+
+const onlyBackEnd = backEndLanguages.difference(frontEndLanguages);
+
+// => Set {"Python", "Java"}
+

全对比相交差异

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
+
+const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);
+
+const onlyFrontEnd = frontEndLanguages.symmetricDifference(backEndLanguages);
+
+// => Set {"HTML", "CSS", "Python", "Java"} 
+
+const onlyBackEnd = backEndLanguages.symmetricDifference(frontEndLanguages);
+
+// => Set {"Python", "Java", "HTML", "CSS"}
+

是否子集

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
+
+const declarativeLanguages = new Set(["HTML", "CSS"]);
+
+declarativeLanguages.isSubsetOf(frontEndLanguages);
+
+// => true
+
+frontEndLanguages.isSubsetOf(declarativeLanguages);
+
+// => false
+

6.使用 Array.prototype.with 更新不可变数组

相关地址:https://web.dev/blog/array-with?hl=zh-cn

Array.prototype.with(index, value)方法会返回对其调用的数组的副本,并将 index 设置为您提供的新 value

以下示例显示了一个年龄数组。您想要创建新的数组副本,同时将第二个年龄从 15 更改为 16

const ages = [10, 15, 20, 25];
+
+const newAges = ages.with(1, 16);
+console.log(newAges); // [10, 16, 20, 25]
+console.log(ages); // [10, 15, 20, 25] (unchanged)
+

7.[ So You Think You Know Git... ]

Scott Chacon 生动的即兴演讲🎤。

End

交个朋友吧~

我是不换(书生),"浪子回头金不换"的不换,"百无一用是书生"的书生,热爱工作,同时在工作之余也热爱开源。

本期周刊到这里就结束了,我们下期再见👋~


最后更新: 2024-02-18 20:36:49
创建日期: 2024-02-18 20:36:49
\ No newline at end of file diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..c52d80e --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +weekly.binlin.wang diff --git a/docs/favicon.png b/docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbe8809c0a4c0847d2446f93b809b1006cd5958 GIT binary patch literal 1710 zcmV;f22uHmP)yr>C^LYsidKoWDnTCVD1(AB4jD3x4%AjqDZT)$N*}lF zJ!?Kd^`3jrx#!%5WadNvpYGo4zt;M%vvc>}>l_%u5QZ>>|0N_9vTnV$5DBe7nTen% zPjT($`$f>fB%i-z=lQDo1aLXZ5s=16fA61~*3bMtXbclr{I>E%Naz4ihfoBJMOex9 z@;e8ieE?0sRX_&9I7C-ugv0-?UcB>)paB9Epxet=0&9R_iAHV#yRJ9~A9Agan z=5LnltPT>zw*cKdVDC_MSwMLVuZ7Q?dueeJqz42^*0tE4~L?aOh&qmRyxn9Rua zz%CC;7?Bs|FWGs%R}AkJu*`DM!az!F(;0~8f@dF@)hTC1t^s+=gK{pa8y76t8+J3g z7NDEw6ab3@YUt#;Egb>5u6Xv5S)HLydk)BMS3NMPJA87Xo6UU%Lb4J#D`5V%!JY%L zXlR(x6AkrM2^{gD+*iHu-Gu*ILIJvC-Z0>%;HjlGI5#<7Sbg=^qFN1!4@4oyvZB9_ zpHEzY?#PX}?f2d|n2Jb0Z20qxT|l#&%~lqII&Ke%1sJVKDWlpSq{I&ZgLOA9s~}KZ zz4YBuCpT8hrny-t(^AN#5ZyC4ncmp2=2stsxIP%mj+Vuaohy(olL@l#4?t;?+1ri{ zLZg3ZrO7>|OpF~n3()A4l(GnC{OJ$CXmqc8N-l{VhvMv|qz2a{Uic{g<|0dE8OR(U z7id-C;fvZEo{#572_G>;6JjVh4%fIpv7DERAVfY1LQ{~I!rEn)m{yR5z!)GC_@yX~ z2McQJ6GDf=$K7HX#Bz?E$PK3aH2R~5{3yx_(^6RbxGE0Y+NxZv`UpDLFm~m#fH|6 zMwJf{#s@CIGI_vfu~RJtHNRFB-$tn8;;Ew(CY7@dvMEC)(k(wP?nP?eFSWy$0)1k5 z-Mau`H&7M005uK~ErmBvQk7SL^rU{q9EoJ-UFc>Kxa0;q{f7?h-4UTbMFJfuA20)%-%$Yz4BCcmU8lJonS&VHuu{nKoL@m1+FE z8>z_S@mxm%GPmh4uUN0q#n*ufz#b3KGN!iFiptvrJVzqg`Ge^p{#EvuNt@y)6R*=< z)V6z9ChnwdB_>QkxyXsDMJcGWujW@I^rWsZ7Y7g1B9=UD%bCZvj_f(Z+># zJ7eu!M%V=yF?5^nImR&#ntr~K;hM7jVE_zyZfXoeTVQ?2jz!`RuF1LEC3+uvY`jTsx)tja&Zy5TeOn zO)6W$k)A(#nO&QDX>M*sbx{yS=Zx&TOsv3dWn)SEhW!JBvUQV}iR!HgZm(r*QPy{S zn^ifZVMdQvz@%@dwW4ArBHphRPb1Q84t=`+>`@@edg%@kd&2nk4GD+k_PY0SOvt)X zL`(J5F7}0BKQnXf<@;RX1TO$UD=Sw4_xSNno(TQ(Xj^76kmC}i-x6xawLjD77bjH& z`aYnQm9?CDJDr(~*V|)`esw70lb#<#B?==&IG&bax8~&czJ1O+8+{+bU=a8NhgMaM zL-lD$sp$uJ0?VqGrl!R9>I@*YFEk)jRaK&T8!+96eiD(pq`CRA!OQbUN(ID1D=H=+ zaucf45h(%kfbS4FjOu1!y}bPLmuF1r5QZ>>A^czBzn$Fw-qfEKdjJ3c07*qoM6N<$ Eg7tnpZvX%Q literal 0 HcmV?d00001 diff --git a/images/favicon.png b/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbe8809c0a4c0847d2446f93b809b1006cd5958 GIT binary patch literal 1710 zcmV;f22uHmP)yr>C^LYsidKoWDnTCVD1(AB4jD3x4%AjqDZT)$N*}lF zJ!?Kd^`3jrx#!%5WadNvpYGo4zt;M%vvc>}>l_%u5QZ>>|0N_9vTnV$5DBe7nTen% zPjT($`$f>fB%i-z=lQDo1aLXZ5s=16fA61~*3bMtXbclr{I>E%Naz4ihfoBJMOex9 z@;e8ieE?0sRX_&9I7C-ugv0-?UcB>)paB9Epxet=0&9R_iAHV#yRJ9~A9Agan z=5LnltPT>zw*cKdVDC_MSwMLVuZ7Q?dueeJqz42^*0tE4~L?aOh&qmRyxn9Rua zz%CC;7?Bs|FWGs%R}AkJu*`DM!az!F(;0~8f@dF@)hTC1t^s+=gK{pa8y76t8+J3g z7NDEw6ab3@YUt#;Egb>5u6Xv5S)HLydk)BMS3NMPJA87Xo6UU%Lb4J#D`5V%!JY%L zXlR(x6AkrM2^{gD+*iHu-Gu*ILIJvC-Z0>%;HjlGI5#<7Sbg=^qFN1!4@4oyvZB9_ zpHEzY?#PX}?f2d|n2Jb0Z20qxT|l#&%~lqII&Ke%1sJVKDWlpSq{I&ZgLOA9s~}KZ zz4YBuCpT8hrny-t(^AN#5ZyC4ncmp2=2stsxIP%mj+Vuaohy(olL@l#4?t;?+1ri{ zLZg3ZrO7>|OpF~n3()A4l(GnC{OJ$CXmqc8N-l{VhvMv|qz2a{Uic{g<|0dE8OR(U z7id-C;fvZEo{#572_G>;6JjVh4%fIpv7DERAVfY1LQ{~I!rEn)m{yR5z!)GC_@yX~ z2McQJ6GDf=$K7HX#Bz?E$PK3aH2R~5{3yx_(^6RbxGE0Y+NxZv`UpDLFm~m#fH|6 zMwJf{#s@CIGI_vfu~RJtHNRFB-$tn8;;Ew(CY7@dvMEC)(k(wP?nP?eFSWy$0)1k5 z-Mau`H&7M005uK~ErmBvQk7SL^rU{q9EoJ-UFc>Kxa0;q{f7?h-4UTbMFJfuA20)%-%$Yz4BCcmU8lJonS&VHuu{nKoL@m1+FE z8>z_S@mxm%GPmh4uUN0q#n*ufz#b3KGN!iFiptvrJVzqg`Ge^p{#EvuNt@y)6R*=< z)V6z9ChnwdB_>QkxyXsDMJcGWujW@I^rWsZ7Y7g1B9=UD%bCZvj_f(Z+># zJ7eu!M%V=yF?5^nImR&#ntr~K;hM7jVE_zyZfXoeTVQ?2jz!`RuF1LEC3+uvY`jTsx)tja&Zy5TeOn zO)6W$k)A(#nO&QDX>M*sbx{yS=Zx&TOsv3dWn)SEhW!JBvUQV}iR!HgZm(r*QPy{S zn^ifZVMdQvz@%@dwW4ArBHphRPb1Q84t=`+>`@@edg%@kd&2nk4GD+k_PY0SOvt)X zL`(J5F7}0BKQnXf<@;RX1TO$UD=Sw4_xSNno(TQ(Xj^76kmC}i-x6xawLjD77bjH& z`aYnQm9?CDJDr(~*V|)`esw70lb#<#B?==&IG&bax8~&czJ1O+8+{+bU=a8NhgMaM zL-lD$sp$uJ0?VqGrl!R9>I@*YFEk)jRaK&T8!+96eiD(pq`CRA!OQbUN(ID1D=H=+ zaucf45h(%kfbS4FjOu1!y}bPLmuF1r5QZ>>A^czBzn$Fw-qfEKdjJ3c07*qoM6N<$ Eg7tnpZvX%Q literal 0 HcmV?d00001 diff --git a/images/logo.svg b/images/logo.svg new file mode 100644 index 0000000..5a79307 --- /dev/null +++ b/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..16d4752 --- /dev/null +++ b/index.html @@ -0,0 +1,54 @@ + Scholar's Weekly

介绍

Documentation Status GitHub release made-with-Markdown

Hello,欢迎👏访问本站点~

这里是不换写周刊的地方,暂时不支持订阅能力,但是已经在计划中了~,不仅会开放Email订阅,同样支持RSS订阅,详情参见里程碑


最后更新: 2022-08-04 23:35:52
创建日期: 2022-07-25 01:39:31
\ No newline at end of file diff --git a/overrides/main.html b/overrides/main.html new file mode 100644 index 0000000..e8ebb94 --- /dev/null +++ b/overrides/main.html @@ -0,0 +1,96 @@ +{% extends "base.html" %} + +{% block content %} +{{ super() }} +{% if page and page.meta and page.meta.template %} +
+{% endif %} +{% endblock %} + +{% block styles %} +{{ super() }} + + + + +{% endblock %} + +{% block extrahead %} + + + + + + +{% endblock %} + + +{% block scripts %} +{{ super() }} +{% if page and page.meta and page.meta.template %} + + +{% endif %} +{% endblock %} + diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..5c48bdf --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["ja"],"separator":"[\\s\\-\uff0c\u3002]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u4ecb\u7ecd","text":"

Hello\uff0c\u6b22\u8fce\ud83d\udc4f\u8bbf\u95ee\u672c\u7ad9\u70b9\uff5e

\u8fd9\u91cc\u662f\u4e0d\u6362\u5199\u5468\u520a\u7684\u5730\u65b9\uff0c\u6682\u65f6\u4e0d\u652f\u6301\u8ba2\u9605\u80fd\u529b\uff0c\u4f46\u662f\u5df2\u7ecf\u5728\u8ba1\u5212\u4e2d\u4e86\uff5e\uff0c\u4e0d\u4ec5\u4f1a\u5f00\u653eEmail\u8ba2\u9605\uff0c\u540c\u6837\u652f\u6301RSS\u8ba2\u9605\uff0c\u8be6\u60c5\u53c2\u89c1\u91cc\u7a0b\u7891\u3002

"},{"location":"DECLARATION/","title":"\u7ad9\u70b9\u58f0\u660e","text":"
  1. \u672c\u7ad9\u70b9\u7531 \u4e0d\u6362 \u7ef4\u62a4\uff0c\u975e\u76c8\u5229\u7ad9\u70b9\uff0c\u672c\u7ad9\u70b9\u5185\u5bb9\u4ec5\u7528\u4e8e\u6b23\u8d4f\u3001\u5b66\u4e60\u7528\u9014\u3002

  2. \u672c\u7ad9\u70b9\u90e8\u5206\u56fe\u7247\u6765\u6e90\u4e8e\u7f51\u7edc\uff08\u4f46\u4e0d\u9650\u4e8e \u767e\u5ea6 \u3001\u8c37\u6b4c \uff09,\u6700\u7ec8\u8457\u4f5c\u6743\u3001\u89e3\u91ca\u6743\u5f52\u539f\u4f5c\u8005\u6240\u6709\uff0c\u5982\u679c\u76f8\u5173\u5f15\u7528\u5185\u5bb9\u6709\u4fb5\u6743\u5acc\u7591\uff0c\u8bf7\u5c3d\u5feb\u8054\u7cfb jadeface.scholar@gmail.com \u5220\u9664\u3002

  3. \u672c\u7ad9\u70b9\u90e8\u5206\u56fe\u7247\u3001\u5185\u5bb9\u5f52\u672c\u4f5c\u8005\u539f\u521b\uff0c\u6d4f\u89c8\u8005\u53ef\u968f\u610f\u4f7f\u7528\uff08\u4f46\u4e0d\u9650\u4e8e\u5546\u7528\uff09\u3002

  4. \u672c\u7ad9\u5185\u5bb9\u9ed8\u8ba4\u8fdb\u5165 \u516c\u5171\u9886\u57df \uff0c\u5373\u6240\u5c55\u793a\u5185\u5bb9\u9075\u5faa CC0 \u534f\u8bae\u3002

\u7b2c\u4e09\u65b9\u8d44\u6e90\u5f15\u7528

  • Wrauter icon by Icons8
    • favicon

CC \u56fe\u7247\u8d44\u6e90\u5bfc\u822a

  • Creative Commons (CC) Search
  • icons8

CC0 \u56fe\u7247\u8d44\u6e90\u5bfc\u822a

  • CC0 Images
  • negativespace.co
  • burst.shopify.com
  • pexels.com
  • pixabay.com
  • splitshire.com
"},{"location":"LANDMARK/","title":"\u91cc\u7a0b\u7891","text":"

Release 2.2.0

  • \u5168\u7ad9 OSS \u56fe\u7247\u5f00\u542f\u81ea\u52a8\u8f6c\u5316 webp
  • \u6b63\u5f0f\u5173\u95ed\u8c37\u6b4c\u5206\u6790
  • \u4f18\u5316 FCP => 0.83s
  • \u4f18\u5316 CSS \u7684\u52a0\u8f7d\u53ef\u80fd\u4f1a\u963b\u585e JS \u7684\u6267\u884c

Release 2.1.0

  • \u66f4\u6362\u4e86\u5c0f\u7ad9\u4e3b\u9898\u8272 green
  • \u4fee\u590d\u4e86\u4e0d\u540c\u5468\u520a\u5207\u6362\u65f6 waline \u8bc4\u8bba\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25\u7684\u95ee\u9898
  • \u65b0\u589e\u4e86\u9875\u9762\u6e29\u99a8\u63d0\u793a
  • \u5168\u7ad9\u53ef\u6258\u7ba1\u9759\u6001\u8d44\u6e90\u652f\u6301 HTTP 2.0
  • \u652f\u6301\u5468\u520a\u521b\u5efa\u548c\u66f4\u65b0\u65e5\u671f\u7684\u663e\u793a

Release 2.0.0

  • \u652f\u6301\u4e86 Email \u8ba2\u9605\u80fd\u529b
  • \u63d0\u4f9b\u4e86\u56fe\u7247\u61d2\u52a0\u8f7d\u80fd\u529b
  • \u63d0\u4f9b\u4e86\u56fe\u7247\u53cc\u51fb\u5e7b\u706f\u7247\u653e\u6620\u6548\u679c
  • \u5f15\u5165 normalize.css \u89c4\u8303\u5168\u5c40\u57fa\u7840\u6807\u7b7e\u7684\u6837\u5f0f
  • \u63a5\u5165\u4e86\u8c37\u6b4c\u5206\u6790\u548c\u767e\u5ea6\u5206\u6790\u89c2\u6d4b\u5168\u7ad9\u6570\u636e
  • \u652f\u6301\u4e86 FeedBack \u53cd\u9988\u5c0f\u7ec4\u4ef6

Release 1.0.0

  • \u652f\u6301\u4e86 Github Actions \u81ea\u52a8\u6784\u5efa\u80fd\u529b
  • \u4f7f\u7528 mkdocs-deploy-gh-pages \u652f\u6301\u4e86\u90e8\u7f72 gh-pages \u81ea\u5b9a\u4e49\u57df\u540d\u7684\u80fd\u529b
  • \u6dfb\u52a0\u4e86\u514d\u8d23\u58f0\u660e
  • \u6dfb\u52a0\u4e86\u91cc\u7a0b\u7891
  • \u6dfb\u52a0 Waline \u8bc4\u8bba\u7cfb\u7edf
"},{"location":"docs/2022/07/01/","title":"Scholar's Weekly \u7b2c1\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1abob\u3001deepl\u3001Building future facing frontend architectures\u3001Oh Shit, Git!?!

"},{"location":"docs/2022/07/01/#1-building-future-facing-frontend-architectures","title":"1. Building future facing frontend architectures","text":"

\u5927\u6982\u5185\u5bb9\u5c31\u662f\u5c55\u5f00\u8bb2\u4e86\u8bb2\uff1a\u6df1\u5165\u63a2\u8ba8\u57fa\u4e8e\u7ec4\u4ef6\u7684\u524d\u7aef\u67b6\u6784\u662f\u5982\u4f55\u968f\u7740\u590d\u6742\u5ea6\u7684\u589e\u52a0\u800c\u5185\u7206\u7684\uff0c\u4ee5\u53ca\u5982\u4f55\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u3002

\u6838\u5fc3\u7684\u51e0\u4e2a\u601d\u60f3\uff1a

  • \u5728\u6784\u5efa\u7ec4\u4ef6\u65f6\uff0c\u81ea\u4e0a\u800c\u4e0b\u4e0e\u81ea\u4e0b\u800c\u4e0a\u4f1a\u5bfc\u81f4\u89c4\u6a21\u4e0a\u7684\u5de8\u5927\u4e0d\u540c\u7ed3\u679c\u3002\u81ea\u4e0a\u800c\u4e0b\u7684\u5fc3\u7406\u6a21\u578b\u901a\u5e38\u662f\u6700\u76f4\u89c2\u7684\u3002\u5728\u5206\u89e3\u7528\u6237\u754c\u9762\u65f6\uff0c\u6700\u5e38\u89c1\u7684\u6a21\u578b\u662f\u5728\u529f\u80fd\u533a\u57df\u5468\u56f4\u753b\u4e0a\u65b9\u6846\uff0c\u7136\u540e\u6210\u4e3a\u4f60\u7684\u7ec4\u4ef6\u3002\u8fd9\u79cd\u529f\u80fd\u5206\u89e3\u7684\u8fc7\u7a0b\u662f\u81ea\u4e0a\u800c\u4e0b\u7684\uff0c\u901a\u5e38\u4f1a\u76f4\u63a5\u5bfc\u81f4\u521b\u5efa\u5177\u6709\u7279\u5b9a\u62bd\u8c61\u6027\u7684\u4e13\u95e8\u7ec4\u4ef6\u3002

  • \u81ea\u4e0a\u800c\u4e0b\u7684\u8bbe\u8ba1\u548c\u6784\u5efa\u4f1a\u5bfc\u81f4\u5355\u4f53\u7ec4\u4ef6\u7684\u4ea7\u751f\u3002 \u4e00\u4e2a\u5145\u6ee1\u4e86\u5355\u4f53\u7ec4\u4ef6\u7684\u4ee3\u7801\u5e93\u4f1a\u5bfc\u81f4\u4e00\u4e2a\u7f13\u6162\u7684\u3001\u5bf9\u53d8\u5316\u6ca1\u6709\u5f39\u6027\u7684\u7ec8\u7aef\u524d\u7aef\u67b6\u6784\u3002 \u5355\u7247\u5f0f\u7ec4\u4ef6\u662f\u4e0d\u597d\u7684\uff0c\u56e0\u4e3a\u3002\u5b83\u4eec\u7684\u53d8\u5316\u548c\u7ef4\u62a4\u6210\u672c\u5f88\u9ad8\u3002

  • \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4e86\u89e3\u5e95\u5c42\u6a21\u578b\u548c\u60c5\u51b5\u6765\u907f\u514d\u521b\u5efa\u5355\u4f53\u7ec4\u4ef6\uff0c\u8fd9\u4e9b\u5e95\u5c42\u6a21\u578b\u548c\u60c5\u51b5\u5f80\u5f80\u5bfc\u81f4\u8fc7\u65e9\u5730\u521b\u5efa\u62bd\u8c61\u6216\u7ee7\u7eed\u6269\u5c55\u62bd\u8c61\u3002 React \u5728\u8bbe\u8ba1\u7ec4\u4ef6\u65f6\u66f4\u6709\u6548\u5730\u9002\u5408\u81ea\u4e0b\u800c\u4e0a\u7684\u6a21\u5f0f\u3002\u8fd9\u66f4\u6709\u6548\u5730\u8ba9\u4f60\u907f\u514d\u8fc7\u65e9\u7684\u62bd\u8c61\u3002

"},{"location":"docs/2022/07/01/#2-bob","title":"2. Bob","text":"

\u4e00\u6b3e macOS \u5e73\u53f0 \u7ffb\u8bd1 \u548c OCR \u8f6f\u4ef6\u3002\u6700\u65b0\u7248\u672c\u5df2\u7ecf\u5f00\u59cb\u6536\u8d39\u5566\uff0c\u9700\u8981\u7684\u53ef\u4ee5\u53bb App Store \u8d2d\u4e70\uff0c\u4f46\u662f\u65e7\u7248\u672c\u4f9d\u65e7\u662f\u514d\u8d39\u7684

\u4e0b\u9762\u7b80\u5355\u7684\u804a\u4e00\u4e0b\uff0c\u600e\u4e48\u5229\u7528\u65e7\u7248\u672c\u642d\u914d deepl \u4f18\u96c5\u7684\u4f7f\u7528\u7ffb\u8bd1\u80fd\u529b\uff5e

  • Bob \u65e7\u7248\u672c\u4f20\u9001\u95e8
  • Bob-plugin-deepl
  • docker-deepl-image
    • \u6ce8\uff1a\u539f\u4f5c\u8005\u5df2\u5220\u9664\u955c\u50cf\uff0c\u53ef\u5728 issue \u5217\u8868\u91cc\u67e5\u770b\u4f20\u9001\u95e8
"},{"location":"docs/2022/07/01/#3-oh-shit-git","title":"3. Oh Shit, Git!?!","text":"

Git \u662f\u5f88\u96be\u7684\uff1a\u641e\u7838\u4e86\u5f88\u5bb9\u6613\uff0c\u800c\u627e\u51fa\u5982\u4f55\u89e3\u51b3\u4f60\u7684\u9519\u8bef\u662f\u4ed6\u5988\u7684\u4e0d\u53ef\u80fd\u7684\u3002Git \u6587\u6863\u6709\u4e00\u4e2a\u9e21\u548c\u86cb\u7684\u95ee\u9898\uff0c\u4f60\u65e0\u6cd5\u641c\u7d22\u5982\u4f55\u8ba9\u81ea\u5df1\u6446\u8131\u56f0\u5883\uff0c\u9664\u975e\u4f60\u5df2\u7ecf\u77e5\u9053\u4f60\u9700\u8981\u77e5\u9053\u7684\u4e1c\u897f\u7684\u540d\u5b57\uff0c\u4ee5\u4fbf\u89e3\u51b3\u4f60\u7684\u95ee\u9898\u3002\u56e0\u6b64\uff0c\u8fd9\u91cc\u6709\u4e00\u4e9b\u6211\u81ea\u5df1\u9677\u5165\u7684\u7cdf\u7cd5\u60c5\u51b5\uff0c\u4ee5\u53ca\u6211\u6700\u7ec8\u662f\u5982\u4f55\u7528\u7b80\u5355\u7684\u82f1\u8bed\u4f7f\u81ea\u5df1\u6446\u8131\u56f0\u5883\u7684\u3002

\ud83d\udc36\u5168\u6587\u65e0\"\u810f\"\u5b57\u7684\u5e2e\u6211\u4eec\u6811\u7acb\u5982\u4f55\u6446\u8131\u4f7f\u7528 git \u540e\u9677\u5165\u7684\u4e00\u4e9b\u5e38\u89c1\u7684\u56f0\u5883\uff5e

"},{"location":"docs/2022/07/01/#4-material-for-mkdocs-scotch-bonnet","title":"4. Material for MkDocs 'Scotch Bonnet'","text":"

Martin Donath\uff0c\u4e5f\u5c31\u662f mkdocs-material \u7684\u4f5c\u8005\uff0c\u5373\u5c06\u8fbe\u5230\u4ed6\u6bcf\u4e2a\u6708 $8000\u7684\u76ee\u6807\u3002

"},{"location":"docs/2022/07/01/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

"},{"location":"docs/2022/07/01/#1-aktivjs-fix-pr","title":"1. \u7ed9AktivJs \u63d0\u4e86\u4e24\u4e2a FIX PR.","text":"
  • Fix template project can't pass stylelint
    • \u4e3b\u8981\u95ee\u9898\u662f\u4f7f\u7528 stylelint \u5fc5\u987b\u6dfb\u52a0 stylelint-prettier \u4f5c\u4e3a\u4f9d\u8d56\uff0c\u4e0d\u7136\u4f1a\u62a5\u9519 Could not find \"stylelint-config-prettier\". Do you need a configBasedir\u3002
  • fix(cli): set truly typescript file path for ForkTsCheckerWebpackPlugin
    • \u4e3b\u8981\u7684\u95ee\u9898\u662f\u4f7f\u7528 ForkTsCheckerWebpackPlugin \u53bb\u5f00\u53d1 cli \u65f6\uff0c\u9700\u8981\u663e\u793a\u7684\u6307\u5b9a typescriptPath \u544a\u8bc9\u63d2\u4ef6\uff0c\u4ece client \u7aef\u7684 node_modules \u4e2d\u53bb\u627e typescript \u4f9d\u8d56\u3002
"},{"location":"docs/2022/07/02/","title":"Scholar's Weekly \u7b2c2\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a \u6280\u672f\u535a\u5ba2\u3001RegExp\u3001V8\u3001UMT\u3001GitHub Actions\u3001MonoRepo

"},{"location":"docs/2022/07/02/#1","title":"1. \u5982\u4f55\u575a\u6301\u5199\u6280\u672f\u535a\u5ba2\uff1f","text":"

\u76f8\u4fe1\u5927\u90e8\u5206\u7231\u597d\u8f93\u51fa\u535a\u5ba2\u7684coder\u90fd\u6709\u7740\u81ea\u5df1\u7684\"\u6d01\u7656\"\u4e0e\"\u98ce\u683c\"\uff0c\u4f46\u662f\u5f80\u5f80\u6709\u65f6\u5019\u5c31\u662f\u8fd9\u4e9b\"\u6d01\u7656\"\u4e0e\"\u98ce\u683c\"\u963b\u788d\u4e86\u6211\u4eec\u7684\u575a\u6301\u5199\u4f5c\uff0c\u6587\u7ae0\u4e3b\u8981\u4ece\u6392\u7248\u89c4\u8303\u5316\u3001\u9009\u9898\u7cfb\u7edf\u5316\u3001\u7ef4\u62a4\u7b80\u5355\u5316\u6765\u5e2e\u52a9\u6211\u4eec\u7834\u9664\u969c\u788d\uff0c\u503c\u5f97\u4e00\u8bfb\uff5e

"},{"location":"docs/2022/07/02/#2-magic-regexp-public","title":"2. magic-regexp Public","text":"

\u4e00\u4e2a\u53ef\u4ee5\u7f16\u8bd1\u7684\u3001\u7c7b\u578b\u5b89\u5168\u7684\u3001\u53ef\u8bfb\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u66ff\u4ee3\u54c1\u3002\u6587\u6863\u4f20\u9001\u95e8\u3002

\u7b80\u5355\u8d34\u4e2aDemo\uff1a

import { createRegExp, exactly, oneOrMore, digit } from 'magic-regexp'\n\ncreateRegExp(\noneOrMore(digit)\n.as('major')\n.and('.')\n.and(oneOrMore(digit).as('minor'))\n.and(exactly('.').and(oneOrMore(char).as('patch')).optionally())\n)\n// /(?<major>(\\d)+)\\.(?<minor>(\\d)+)(\\.(?<patch>(.)+))?/\n
"},{"location":"docs/2022/07/02/#3-discontinuing-release-blog-posts","title":"3. Discontinuing release blog posts","text":"

V8\u5f15\u64ce \u5728 v9.9 \u7248\u672c\u4e4b\u524d\u90fd\u4fdd\u6301\u7740\u6bcf\u4e2a\u65b0\u5206\u652f\u53d1\u5e03\u535a\u5ba2\u6587\u7ae0\uff0c\u4f46\u662f\u5b98\u65b9\u56e2\u961f\u5ba3\u5e03\u4ece v10.0 \u5f00\u59cb\u5c06\u4e0d\u518d\u4e3a\u6bcf\u4e2a\u65b0\u5206\u652f\u53d1\u5e03\u535a\u5ba2\uff0c\u5b9e\u9645\u4e0a\uff0c\u4eceV9.9\u7248\u672c\u5f00\u59cb\u5c31\u6ca1\u6709\u53d1\u8fc7\u4e86\u3002

"},{"location":"docs/2022/07/02/#4-utm","title":"4. UTM","text":"

Run virtual machines on IOS and MacOS

(\u56fe\u7247\u7d20\u6750\u6765\u6e90\u4e8e UMT) \u5b98\u7f51\uff0c\u4e8c\u6b21\u7f16\u8f91\u5408\u6210)

\u4ee5\u524d\u5728 IPad \u4e0a\u4f7f\u7528 iSH \u542f\u52a8\u4e00\u4e2a Node \u9759\u6001\u8d44\u6e90\u670d\u52a1\u5668\uff0c\u7528\u7740\u8fd8\u4e0d\u9519\u3002\u4f46\u662f UTM \u8fd9\u4e2a\u611f\u89c9\u6709\u4e9b\u8033\u76ee\u4e00\u65b0\u7684\u611f\u89c9\u3002

"},{"location":"docs/2022/07/02/#5-manually-trigger-a-github-actions","title":"5. Manually Trigger a GitHub Actions","text":"

\u5927\u90e8\u5206\u60c5\u51b5\u4e0b Github Actions \u90fd\u662f\u81ea\u52a8\u6267\u884c\u7684\uff0c\u4f46\u662f\u5982\u4f55\u624b\u52a8\u7684\u53bb\u6267\u884c\u5462\uff1f\u8fd9\u91cc\u63d0\u4f9b\u4e86\u793a\u4f8b\u3002

name: Production Deployment\non: \n  workflow_dispatch:\n
(: \u672c\u7ad9\u70b9\u7684\u8ba2\u9605\u90ae\u4ef6\u901a\u77e5 Actions \u5c31\u662f\u901a\u8fc7\u624b\u52a8\u89e6\u53d1\u7684\uff0c\u4e3a\u4e86\u4fdd\u8bc1\u6bcf\u6b21\u8fed\u4ee3\u5347\u7ea7\u4e0d\u5f71\u54cd\u4e3b\u8981\u5185\u5bb9\u7684\u8ba2\u9605\u7528\u6237\u9891\u7e41\u6536\u5230\u90ae\u4ef6\u901a\u77e5\u3002

"},{"location":"docs/2022/07/02/#6-how-to-easily-manage-dependencies-in-a-js-monorepo","title":"6. How to Easily Manage Dependencies in a JS Monorepo","text":"

\u9879\u76ee\u5f00\u53d1\u7684\u4f9d\u8d56\u95ee\u9898\u5411\u6765\u662f\u5f00\u53d1\u8005\u6bd4\u8f83\u5934\u75bc\u7684\u95ee\u9898\uff0c\u4f46\u662f\u7ee7 pnpm \u4e4b\u540e\uff0c\u539f\u4f5c\u8005\u53c8\u8bde\u751f\u4e00\u5927\u4f5c Bit + pnpm\u3002\u4ee5\u4e0b\u662f Bit \u5bf9\u4e8e\u5305\u4f9d\u8d56\u7684\u8f93\u51fa\u4fe1\u606f\u3002

"},{"location":"docs/2022/07/02/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

"},{"location":"docs/2022/07/02/#1-weekly-release-200","title":"1. \u7ed9 weekly \u5468\u520a\u5c0f\u7ad9\u65b0\u589e\u4e86\u82e5\u5e72\u80fd\u529b\uff0c\u8fed\u4ee3\u81f3 Release 2.0.0\uff0c\u4e5f\u53ef\u67e5\u770b \u91cc\u7a0b\u7891","text":"
  • \u652f\u6301\u4e86 Email \u8ba2\u9605\u80fd\u529b
  • \u63d0\u4f9b\u4e86\u56fe\u7247\u61d2\u52a0\u8f7d\u80fd\u529b
  • \u63d0\u4f9b\u4e86\u56fe\u7247\u53cc\u51fb\u5e7b\u706f\u7247\u653e\u6620\u6548\u679c
  • \u5f15\u5165 normalize.css \u89c4\u8303\u5168\u5c40\u57fa\u7840\u6807\u7b7e\u7684\u6837\u5f0f
  • \u63a5\u5165\u4e86\u8c37\u6b4c\u5206\u6790\u548c\u767e\u5ea6\u5206\u6790\u89c2\u6d4b\u5168\u7ad9\u6570\u636e
  • \u652f\u6301\u4e86 FeedBack \u53cd\u9988\u5c0f\u7ec4\u4ef6
"},{"location":"docs/2022/07/02/#2-mkdocs-waline","title":"2. \u7ed9 MkDocs \u793e\u533a\u751f\u6001\u8d21\u732e\u4e86\u4e00\u4efd\uff1a\u63a5\u5165\u56fd\u5185 Waline \u8bc4\u8bba\u7cfb\u7edf\u7684\u65b9\u6848\u3002","text":""},{"location":"docs/2022/07/02/#3-waline-react","title":"3. \u7ed9 Waline \u793e\u533a\u8d21\u732e\u7684 React \u7248\u672c\u7684\u5305\u6536\u5230\u4e86\u539f\u4f5c\u8005\u7684 \ud83d\udc4d\uff0c\u80fd\u6536\u5230\u6b63\u5411\u53cd\u9988\u5fc3\u60c5\u8fd8\u662f\u86ee\u6109\u60a6\u7684\u3002","text":""},{"location":"docs/2022/08/03/","title":"Scholar's Weekly \u7b2c3\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a waifuExtension\u3001release-please\u3001DNS\u3001Antd\u3001V8\u3001CDN

"},{"location":"docs/2022/08/03/#1-waifuextension","title":"1. waifuExtension","text":"

\u7b80\u5355\u8bf4\u5c31\u662f\uff0c\u5145\u5206\u5229\u7528 CPU \u3001GPU \u548c ANE \u7684\u7684\u4f18\u52bf\uff0c\u5229\u7528\u673a\u5668\u5b66\u4e60\uff0c\u653e\u5927\u56fe\u7247\uff0c\u5e76\u4fdd\u6301\u9ad8\u5ea6\u6e05\u6670\u3002

\u8d34\u4e2a\u56fe\u611f\u53d7\u4e0b\u6548\u679c\uff5e

"},{"location":"docs/2022/08/03/#2-release-please","title":"2. release-please","text":"

\u539f standard-version \u5df2\u88ab\u5f03\u7528\uff0c\u5b98\u65b9\u63a8\u8350\u4f7f\u7528 release-please\u3002

"},{"location":"docs/2022/08/03/#3-dns","title":"3. DNS \u67e5\u8be2\u539f\u7406\u8be6\u89e3","text":"

\u86ee\u4e0d\u9519\u7684\u6587\u7ae0\uff0c\u962e\u5927 \u51fa\u54c1\uff0c\u5fc5\u5c5e\u7cbe\u54c1\uff01\u4e0b\u9762\u63d0\u4f9b\u4e0b\u6587\u7ae0\u4e2d\u51fa\u73b0\u7684\u5de5\u5177\uff0c\u4ee5\u53ca\u76f8\u5173\u6587\u6863\u5730\u5740\uff5e

  • Dig Command in macOS and Linux(DNS Lookup)
    • Dig Command \u7684\u5b89\u88c5\u6307\u5357
  • DiG HOWTO
    • \u600e\u4e48\u4f7f\u7528 Dig.

\u6211\u6d45\u5c1d\u4e86\u4e00\u4e0b\u5b50\uff0c\u53d1\u73b0\u4e2a\u6709\u610f\u601d\u7684\u4e8b\u60c5\uff0c\u963f\u91cc\u7684 vip DNS \u670d\u52a1\u5668\uff0c\u5728 TLD \u670d\u52a1\u5668\u4e2d\u6ca1\u6709\u5bf9\u5e94\u7684 ip \u7f13\u5b58\u4fe1\u606f\uff1a

\u7136\u540e\uff0c\u6211\u7ecf\u5386\u4e86\u4e00\u6ce2 vip DNS \u53cd\u67e5\uff0c\u6700\u7ec8\u627e\u5230\u4e86\u5b83\u7684 ip \u5730\u5740\uff0c\u6700\u7ec8\uff0c\u501f\u7740 DNS \u89e3\u6790\u7684\u6700\u540e\u4e00\u6b65\uff0c\u627e\u5230\u4e86\u6211\u7684 \u4e8c\u7ea7\u57df\u540d \u7684 \u89e3\u6790\u8bb0\u5f55:

"},{"location":"docs/2022/08/03/#4-75cdn","title":"4. 75CDN","text":"

360 \u65d7\u4e0b \u524d\u7aef\u9759\u6001\u8d44\u6e90\u5e93\uff0c\u53f7\u79f0 \u9996\u4e2a\u652f\u6301 HTTP/2 \u7684 CDN \u670d\u52a1\uff0c\u8fd9\u6b21\u5468\u520a\u7ad9\u70b9\u4e5f\u7edf\u4e00\u6362\u4e86\uff0c\u770b\u4e0b\u6548\u679c\uff1a

"},{"location":"docs/2022/08/03/#5-antd-v5-to-v4v5-to-v3v4-to-v3","title":"5. Antd \u51c6\u5907\u51fa\u517c\u5bb9 v5-to-v4\u3001v5-to-v3\u3001v4-to-v3 \u7684\u5305\u4e86","text":"

\u53ef\u4ee5\u5927\u81f4\u770b\u4e0b V5 \u7684\u8ba1\u5212\uff5e

"},{"location":"docs/2022/08/03/#6-the-story-of-a-v8-performance-cliff-in-react","title":"6. The story of a V8 performance cliff in React","text":"

\u5728\u6392\u67e5\u95ee\u9898\u7684\u65f6\u5019\u770b\u5230\u4e86\u8fd9\u7bc7 V8 \u7684\u6587\u7ae0\uff0c\u6587\u672b\u7684\u6700\u540e\uff0c\u6709\u8fd9\u4e48\u4e00\u4e2a\u4f8b\u5b50\uff0c\u89c9\u5f97\u633a\u6709\u610f\u601d\u7684\uff0c\u62ff\u51fa\u6765\u5206\u4eab\u4e00\u4e0b\uff5e

\u7b14\u8bb0

\u5199\u51fa\u53ef\u8bfb\u7684\u4ee3\u7801\uff0c\u6027\u80fd\u5c31\u4f1a\u968f\u4e4b\u800c\u6765\u3002

"},{"location":"docs/2022/08/03/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

"},{"location":"docs/2022/08/03/#1-weekly-release-210","title":"1. \u4f18\u5316\u4e86 weekly \u5468\u520a\u5c0f\u7ad9\u7684\u90e8\u5206\u5185\u5bb9\uff0c\u8fed\u4ee3\u81f3 Release 2.1.0\uff0c\u4e5f\u53ef\u67e5\u770b \u91cc\u7a0b\u7891","text":"
  • \u66f4\u6362\u4e86\u5c0f\u7ad9\u4e3b\u9898\u8272 green
  • \u4fee\u590d\u4e86\u4e0d\u540c\u5468\u520a\u5207\u6362\u65f6 waline \u8bc4\u8bba\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25\u7684\u95ee\u9898
  • \u65b0\u589e\u4e86\u9875\u9762\u6e29\u99a8\u63d0\u793a
  • \u5168\u7ad9\u53ef\u6258\u7ba1\u9759\u6001\u8d44\u6e90\u652f\u6301 HTTP 2.0
  • \u652f\u6301\u5468\u520a\u521b\u5efa\u548c\u66f4\u65b0\u65e5\u671f\u7684\u663e\u793a
"},{"location":"docs/2022/08/03/#2-aktivjs-feature-pr-react-strictmode","title":"2. \u7ed9 AktivJs \u63d0\u4e86\u4e2a Feature PR \u652f\u6301\u4e86 React StrictMode \u6a21\u5f0f","text":""},{"location":"docs/2022/08/03/#3-changeset-log-forrmat-montagejschangelog-montage","title":"3. \u51cc\u6668\u6770\u4f5c\uff0c\u5199\u4e86\u4e2a changeset \u7684 log forrmat \u63d2\u4ef6\u5305\uff1a@montagejs/changelog-montage","text":"

\u5927\u6982\u6548\u679c\u662f\u8fd9\u6837\uff5e

"},{"location":"docs/2022/08/04/","title":"Scholar's Weekly \u7b2c4\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a React\u3001\u4e60\u60ef\u3001Open Source\u3001CSS\u3001esbuild\u3001typescript

"},{"location":"docs/2022/08/04/#1-react-re-renders-guide","title":"1. React re-renders guide","text":"

React \u91cd\u65b0\u6e32\u67d3\u6307\u5357\uff1a\u4e00\u5207\u5c3d\u5728\u638c\u63e1\u3002

\u8be5\u6307\u5357\u89e3\u91ca\u4e86\u4ec0\u4e48\u662f\u91cd\u65b0\u6e32\u67d3\uff0c\u4ec0\u4e48\u662f\u5fc5\u8981\u7684\u548c\u4e0d\u5fc5\u8981\u7684\u91cd\u65b0\u6e32\u67d3\uff0c\u4ec0\u4e48\u53ef\u4ee5\u89e6\u53d1 React \u7ec4\u4ef6\u91cd\u65b0\u6e32\u67d3\u3002

\u8fd8\u5305\u62ec\u53ef\u4ee5\u5e2e\u52a9\u9632\u6b62\u91cd\u65b0\u6e32\u67d3\u7684\u6700\u91cd\u8981\u7684\u6a21\u5f0f\u548c\u4e00\u4e9b\u5bfc\u81f4\u4e0d\u5fc5\u8981\u7684\u91cd\u65b0\u6e32\u67d3\u548c\u6027\u80fd\u4e0d\u4f73\u7684\u53cd\u6a21\u5f0f\u3002\u6bcf\u4e2a\u6a21\u5f0f\u548c\u53cd\u6a21\u5f0f\u90fd\u9644\u6709\u89c6\u89c9\u5e2e\u52a9\u548c\u5de5\u4f5c\u4ee3\u7801\u793a\u4f8b\u3002

"},{"location":"docs/2022/08/04/#2-6","title":"2. \u65b0\u62fe\u53d6\u7684 6 \u4e2a\u4e60\u60ef\u548c\u65b9\u6cd5","text":"

------ \u6765\u81ea\u300a\u4e91\u8c26\u548c\u4ed6\u7684\u670b\u53cb\u4eec\u300b

\u5370\u8c61\u6bd4\u8f83\u6df1\u523b\u7684\u4e00\u53e5\u8bdd

\u300c\u6240\u6709\u95ee\u9898\u90fd\u5e94\u5f53\u662f\u7b80\u5355\u7684\u300d\uff0c\u5982\u679c\u89c9\u5f97\u590d\u6742\uff0c\u90a3\u4e00\u5b9a\u662f\u56e0\u4e3a\u7406\u89e3\u8fd8\u4e0d\u591f\u5230\u4f4d\u3002

"},{"location":"docs/2022/08/04/#3-the-three-fs-of-open-source-development","title":"3. The Three F's of Open Source Development","text":"

Fix it, Fork it, Fuck off.

\u6211\u7684\u7406\u89e3\uff0c\u4e0a\u8ff0\u4e09\u4e2a\u8bcd\u5c31\u662f\u5f00\u6e90\u5f00\u53d1\u8005\u7684\u4e09\u4e2a\u5883\u754c\u3002\u6700\u574f\u7684\u60c5\u51b5\u5c31\u662f\u6eda\u86cb\uff0c\u79bb\u5f00\u539f\u4f5c\u8005\u7684\u5f00\u6e90\u4ed3\u5e93\uff08issue\u3001email\u3001discussions\uff09\u3002

"},{"location":"docs/2022/08/04/#4-finer-grained-control-over-css-transforms-with-individual-transform-properties","title":"4. Finer grained control over CSS transforms with individual transform properties","text":"

\u5bf9 css \u7684 transform \u8fdb\u884c\u4e86\u66f4\u7ec6\u7c92\u5ea6\u7684\u63a7\u5236\u3002

@keyframes anim {\n0% { transform: translateX(0%); }\n5% { transform: translateX(5%) rotate(90deg) scale(1.2); }\n10% { transform: translateX(10%) rotate(180deg) scale(1.2); }\n90% { transform: translateX(90%) rotate(180deg) scale(1.2); }\n95% { transform: translateX(95%) rotate(270deg) scale(1.2); }\n100% { transform: translateX(100%) rotate(360deg); }\n}\n\n.target {\nanimation: anim 2s;\nanimation-fill-mode: forwards;\n}\n
"},{"location":"docs/2022/08/04/#5-boost-your-productivity-with-typescript-project-references","title":"5. Boost your productivity with TypeScript project references","text":"

\u4f7f\u7528 TypeScript 3.0 \u7684 project references \u7279\u6027\uff0c\u6765\u4f18\u5316\u7f16\u8bd1\u6027\u80fd\u3002

\u603b\u7684\u6765\u8bf4\uff0c\u5bf9\u4e8e MonoRepo \u9879\u76ee\u7684\u6784\u5efa\u4f18\u5316\u7edd\u5bf9\u662f\u9ad8\u6548\u7684\u3002

\u56fd\u5185\u7528\u6237\uff0c\u4e5f\u53ef\u79fb\u6b65 \u795e\u5149 \u5927\u4f6c\u7684 TypeScript \u7f16\u8bd1\u6027\u80fd\u4f18\u5316\uff1aProject Reference.

"},{"location":"docs/2022/08/04/#6-esbuild-es5-es6","title":"6. esbuild \u4f5c\u4e3a\u538b\u7f29\u5668\u4f1a\u5bf9 ES5 \u4ee3\u7801\u505a\u53cd\u5411\"\u4f18\u5316\"\u53d8\u6210 ES6","text":"

\u8ba8\u8bba\u6765\u81ea\u4e8e Umi \u793e\u533a\uff0c\u4e4b\u524d\u6ca1\u600e\u4e48\u6ce8\u610f esbuild \u4f1a\u8fdb\u884c \u53cd\u5411\"\u4f18\u5316\"\u3002

"},{"location":"docs/2022/08/04/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

"},{"location":"docs/2022/08/04/#1-montagejs-https-webpack-plugin","title":"1. \u89c4\u5212\u4e86\u4e0b montagejs \u4e2d\u5373\u5c06\u51fa\u73b0\u7684\u4e00\u4e2a\u65b0\u63d2\u4ef6 https-webpack-plugin \u7684\u84dd\u56fe\u3002","text":"

\u4f7f\u7528 mkcert \u5728 webpack-dev-server \u5b8c\u6210\u7684\u67d0\u4e2a\u9636\u6bb5\uff0c\u5b8c\u6210\u81ea\u52a8\u672c\u5730\u57df\u540d https \u8bc1\u4e66\u7b7e\u53d1\u3002

"},{"location":"docs/2022/08/04/#2-dumi-docs-pr-httpsgithubcomumijsdumipull1167","title":"2. \u7ed9 dumi \u63d0\u4e86\u4e2a\u6587\u6863\u7f3a\u5931\u7684 docs PR : https://github.com/umijs/dumi/pull/1167","text":"

\u539f\u56e0\u662f\uff0cdocs \u6587\u6863\u76ee\u5f55\u4f1a\u81ea\u52a8\u6392\u51fa fixtures \u76ee\u5f55\uff0c\u8fd9\u4e2a\u5728\u6587\u6863\u4e2d\u5e76\u6ca1\u6709\u4f53\u73b0\uff0c\u4f46\u662f\u6211\u5728\u6e90\u7801\u4e2d\u627e\u5230\u4e86\u3002

"},{"location":"docs/2022/08/04/#3-react-chrono-fix-pr-httpsgithubcomprabhuignotoreact-chronopull282","title":"3. \u7ed9 react-chrono \u63d0\u4e86\u4e2a fix PR : https://github.com/prabhuignoto/react-chrono/pull/282","text":"

GitHub \"\u9057\u50cf\" \u6210\u529f\u8eba\u5728\u4e86 3k+ star \u7684\u4ed3\u5e93\u91cc\u3002

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2022/08/05/","title":"Scholar's Weekly \u7b2c5\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a Vitest\u3001c8\u3001preload\u3001\u8bbe\u8ba1\u6a21\u5f0f\u3001web3\u3001islands

"},{"location":"docs/2022/08/05/#1-vitest-0220-break-changes","title":"1. Vitest \u53d1\u5e03\u4e86 0.22.0 \u7684 Break Changes \u7248\u672c","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/vitest-dev/vitest/releases

c8\u8986\u76d6\u7387\u652f\u6301\u73b0\u5728\u9700\u8981\u5b89\u88c5\u540c\u884c\u7684\u4f9d\u8d56\u9879@vitest/coverage-c8\u3002\u53e6\u5916\uff0c\u4f60\u53ef\u4ee5\u5b89\u88c5 @vitest/coverage-istanbul \u6765\u4f7f\u7528 istanbul \u8986\u76d6\uff0c\u800c\u4e0d\u662f c8\u3002

  • istanbul
  • c8
"},{"location":"docs/2022/08/05/#2-resetercss-repo","title":"2. \u5728 reseter.css \u7684 repo \u4e2d\u770b\u5230\u4e00\u4e2a\u5c0f\u6280\u5de7","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/resetercss/reseter.css

\u6b63\u597d\u770b\u5230\u4e86 rottenpen \u7684\u5468\u520a\u4e2d\u5f15\u7528\u4e86\u4e00\u7bc7 \u9884\u52a0\u8f7d\u6307\u5357\uff0c\u8fd9\u91cc\u501f\u94fe\u5f15\u7528\u4e0b\u3002

  • \u9884\u52a0\u8f7d\u5173\u952e\u8d44\u4ea7\u4ee5\u63d0\u9ad8\u52a0\u8f7d\u901f\u5ea6
"},{"location":"docs/2022/08/05/#3-typescript","title":"3. TypeScript \u4e2d\u7684\u4f9d\u8d56\u5012\u7f6e\u539f\u5219","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://dev.to/jmalvarez/dependency-inversion-principle-in-typescript-4nm0

\u8001\u54e5\u5206\u522b example \u4e86\u4f7f\u7528 TypeScript \u9610\u8ff0\u8bbe\u8ba1\u6a21\u5f0f\u4e2d\u7684 5 \u4e2a\u8bbe\u8ba1\u539f\u5219\u3002

"},{"location":"docs/2022/08/05/#4-web3","title":"4. \u4f7f\u7528 web3 \u5bf9\u7528\u6237\u8eab\u4efd\u8fdb\u884c\u9a8c\u8bc1","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://dev.to/anggapur/user-authentication-with-web3-4he8

\u4e0d\u7528\u6536\u96c6\u7528\u6237\u4fe1\u606f\uff0c\u4e5f\u53ef\u8bc6\u522b\u5230\u7528\u6237\u3002

"},{"location":"docs/2022/08/05/#5-islands-architecture","title":"5. islands-architecture","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.patterns.dev/posts/islands-architecture

\u6700\u8fd1\u542c\u5230\u7684\u6bd4\u8f83\u591a\u7684\u4e00\u4e2a\u540d\u8bcd\uff1a\u5b64\u5c9b\u67b6\u6784

\u4ee3\u8868\u4f5c

  • Astro

\u51e0\u4e2a\u5c0f\u65f6\u524d\uff0c\u8fd8\u770b\u5230 \u4e09\u5143\u540c\u5b66\u57fa\u4e8e React \u641e\u4e86\u4e2a\u5b64\u5c9b\u67b6\u6784\u5b9e\u73b0\uff1a\u57fa\u4e8e React \u7684 Islands \u67b6\u6784\u5b9e\u73b0

"},{"location":"docs/2022/08/05/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

\u6bd4\u8f83\u5fd9\uff0c\u6ca1\u505a\u4ec0\u4e48\u5927\u4e1c\u897f\uff0c\u4e5f\u6ca1\u6709\u7ed9\u5f00\u6e90\u793e\u533a\u505a\u8d21\u732e\uff0c\u4e0d\u8fc7\u7b80\u5355\u505a\u4e86\u51e0\u4e2a\u5c0f\u4e1c\u897f\u3002

"},{"location":"docs/2022/08/05/#1-http","title":"1. \u82b1\u4e86\u4e9b\u65f6\u95f4\uff0c\u53bb\u590d\u4e60\u4e86\u4e0b HTTP \u7f13\u5b58\u76f8\u5173\u7684\u77e5\u8bc6\uff0c\u8fd9\u6b21\u6bd4\u8f83\u7279\u6b8a\uff0c\u9664\u4e86\u7ffb\u770b\u5e02\u9762\u4e0a\u7684\u6587\u7ae0\uff0c\u7279\u5730\u7ed3\u5408\u89c4\u8303\u53bb\u6316\u4e86\u6316\u3002","text":"

\u6398\u91d1\u5730\u5740\uff1ahttps://juejin.cn/post/7133579119807168543

\u4e00\u70b9\u601d\u8003\uff1a\u5c3d\u4fe1\u522b\u4eba\u7684\u6587\u7ae0\uff0c\u5219\u4e0d\u5982\u65e0\u6587\u7ae0\uff0c\u56e0\u4e3a\u89c4\u5219\u3001\u89c4\u8303\u662f\u4f1a\u6539\u53d8\u7684\uff0c\u4f46\u662f\u6587\u7ae0\uff0c\u8fc7\u53bb\u7684\u8fd8\u662f\u8fc7\u53bb\u7684\u3002\u67d0\u79cd\u7a0b\u5ea6\u4e0a\u9700\u8981\u4e0d\u65ad\u7684\u3001\u4e3b\u52a8\u7684\u53bb\u5438\u6536\u65b0\u7684\u4e1c\u897f\u3002

"},{"location":"docs/2022/08/05/#2-montagejs-vitest-test-runner","title":"2. \u7ed9 montagejs \u6362\u4e86 vitest \u53bb\u505a test runner\u3002","text":"

\u56e0\u4e3a\u4ee5\u524d\u6bd4\u8f83\u719f\u6089 jest\uff0c\u6240\u4ee5\u6b64\u6b21\u8fc1\u79fb vitest \u51e0\u4e4e\u65e0\u611f\uff0c\u6bd4\u8f83\u559c\u6b22 vitest \u63d0\u4f9b\u7684 ui \u80fd\u529b\uff0c\u6709\u4e9b\u50cf cypress\uff0c\u5f88\u597d\u7684\u4f53\u9a8c\u3002

"},{"location":"docs/2022/08/05/#3-montagejs","title":"3. montagejs \u4e2d\u65b0\u52a0\u4e86\u4e24\u4e2a\u5305","text":"

can i use \u7075\u611f\u6765\u81ea\u4e8e CanIUse \u8fd9\u4e2a\u7f51\u7ad9\uff0c\u4f8b\u5982\u6211\u60f3\u5224\u65ad loading \u5728\u4e0d\u540c\u7684\u6d4f\u89c8\u5668\u73af\u5883\u4e0b\u7684 img \u6807\u7b7e\u4e2d\u662f\u5426\u652f\u6301\u7b49\u7b49\u3002

  • @montagejs/can-i-use

\u4f5c\u4e3a\u8f6e\u5b50\uff0c\u624b\u5199\u4e86\u4e0b\u56fe\u7247\u61d2\u52a0\u8f7d\u5728 react \u4e2d\u7684\u5e94\u7528\uff0c\u7ec6\u8282\u62c9\u6ee1\u3002

\u6bd4\u5982:

  • \u4e0d\u652f\u6301 loading \u505a\u964d\u7ea7
  • \u5355\u9875 SPA\uff0c\u8def\u7531\u8df3\u8f6c\u4e0d\u4f1a\u4e8c\u6b21\u89e6\u53d1 load \u6216\u8005 DOMContentLoad\uff0c\u9700\u8981\u4e3b\u52a8\u89e6\u53d1\u4e00\u4e0b\u61d2\u52a0\u8f7d
  • \u61d2\u52a0\u8f7d\u7684\u95f4\u6b47\u65f6\u95f4\uff0c\u4f7f\u7528\u9884\u52a0\u8f7d\u5f25\u8865\uff08\u57fa\u4e8e\u8bbe\u8ba1\u6a21\u5f0f\u7684\u4ee3\u7406\u6a21\u5f0f\u5b9e\u73b0\uff09

\u8fd8\u5728\u5b8c\u5584\u4e2d\uff0c\u8fd8\u80fd\u8fdb\u5316\uff0c\u5148\u505a\u4e86\u7b80\u5355\u7248\u672c

\u4f53\u9a8c\u5730\u5740\uff1ahttps://montage.bigdreamer.cc/components/mit/react-lazy-load-image

  • @montagejs/react-lazy-load-image

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2022/08/06/","title":"Scholar's Weekly \u7b2c6\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a react\u3001img\u3001fetchpriority\u3001noopener\u3001csp

"},{"location":"docs/2022/08/06/#1-million-react","title":"1. million-react","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/aidenybai/million-react

\u4e0b\u9762\u662f \u767d\u5b87\u5f64\uff0c\u5bf9\u4e8e million \u4e0e react \u7684\u76f8\u5173\u5bf9\u6bd4\u8f93\u51fa\u3002

\u80cc\u666f

Many Virtual DOM libraries still struggle with render speed compared to newer methods of rendering.

\u4e0e\u8f83\u65b0\u7684\u6e32\u67d3\u65b9\u6cd5\u76f8\u6bd4\uff0c\u8bb8\u591a\u865a\u62dfDOM\u5e93\u4ecd\u7136\u5728\u6e32\u67d3\u901f\u5ea6\u4e0a\u6323\u624e\u3002

\u76f8\u5173\u5730\u5740\uff1ahttps://krausest.github.io/js-framework-benchmark/current.html

\u4e00\u4e9b\u6709\u4ef7\u503c\u7684\u4eae\u70b9\uff1a

  • Lightweight
    • tree-shaking & bundle \u540e < 1kb\u3002
  • Performance
    • \u4f7f\u7528\u6700\u65b0\u7684\u7f16\u8bd1\u5668\u6027\u80fd\u4f18\u5316\u3002
  • Compiler-first
    • \u7f16\u8bd1\u5668\u4f18\u5148
    • \u5bf9\u7f16\u8bd1\u5668\u7684\u5168\u7c7b\u652f\u6301
  • .....
"},{"location":"docs/2022/08/06/#2-use-fetchpriorityhigh-to-load-your-lcp-hero-image-sooner","title":"2. Use fetchpriority=high to load your LCP hero image sooner","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://addyosmani.com/blog/fetch-priority/

<!-- Increase the priority of this LCP hero image --> \n<img src=\"hero-image.jpg\" fetchpriority=\"high\" alt=\"Hero\">\n\n<!-- Decrease the priority for this above-the-fold image --> \n<img src=\"happy-cats.avif\" fetchpriority=\"low\" alt=\"Cat\">\n\n<!-- The third-party contents of this iframe load with a low priority --> \n<iframe src=\"https://youtu.be/JfVOS4VSpmA\" fetchpriority=\"low\"></iframe>\n\n<script> // Trigger a fetch with low priority \nlet suggestedContent = await fetch(\"/content/suggested\", {priority: \"low\"}); </script>\n\n// Scripts that are not critical can also be loaded with low-priority \n<script src=\"blocking_but_unimportant.js\" fetchpriority=\"low\"></script>\n

\u4f18\u5148\u7ea7\u548c\u9884\u52a0\u8f7d\u7684\u4e0d\u540c\u70b9\u662f\u4ec0\u4e48\uff1f

  • rel=preload \u5f53\u6d4f\u89c8\u5668\u53d1\u73b0\u8d44\u6e90\uff08\u4f8b\u5982\uff0c\u89e3\u6790\u5668\u4e0d\u53ef\u89c1\u7684\u4e1c\u897f\uff0c\u5982\u80cc\u666f\u56fe\u50cf\u6216\u9700\u8981\u9996\u5148\u52a0\u8f7d\u811a\u672c\u7684\u8d44\u6e90\uff09\u65f6\uff0c\u5c06\u5176\u89c6\u4e3a\u4e00\u79cd\u8c03\u6574\u65b9\u5f0f\u4f1a\u5f88\u6709\u5e2e\u52a9\u3002
  • \u4f18\u5148\u7ea7\u63d0\u793a\u8ba9\u60a8\u8c03\u6574\u8d44\u6e90\u52a0\u8f7d\u7684\u4f18\u5148\u7ea7\uff08\u72ec\u7acb\u4e8e\u53d1\u73b0\uff09\u3002
"},{"location":"docs/2022/08/06/#3-about-relnoopener","title":"3. About rel=noopener","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://mathiasbynens.github.io/rel-noopener/#hax

\u76f8\u5173 PR \u5730\u5740\uff1ahttps://github.com/whatwg/html/pull/4330

\u5173\u4e8e rel=noopener \u8fd9\u4e2a\u5c5e\u6027\uff0c\u53ef\u80fd\u6709\u4e9b\u9c9c\u4e3a\u4eba\u77e5\uff0c\u4e5f\u53ef\u80fd\u5927\u90e8\u5206\u5c0f\u4f19\u4f34\u90fd\u662f\u77e5\u9053\u7684\uff0c\u8fd9\u91cc\u8fd8\u662f\u4f5c\u4e3a\u5468\u520a\u5185\u5bb9\u518d\u6b21\u5206\u4eab\u3002

<!-- \u8df3\u8f6c\u8fc7\u540e\u65e0\u524d\u4e00\u4e2a\u9875\u9762\u7684 `window` \u64cd\u4f5c\u6743 -->\n<a rel=\"noopener\" href=\"https://baidu.com\" target=\"_blank\">\u767e\u5ea6\u4e00\u4e0b</a>\n<!-- \u8df3\u8f6c\u8fc7\u540e\u6709\u524d\u4e00\u4e2a\u9875\u9762\u7684 `window` \u64cd\u4f5c\u6743 -->\n<a rel=\"opener\" href=\"https://baidu.com\" target=\"_blank\">\u767e\u5ea6\u4e00\u4e0b\uff0c\u5e76\u4f7f\u539f\u9875\u9762\u52a0\u8f7d\u4e00\u4e2a\u5e7f\u544a\u9875</a>\n

\u53ef\u4ee5\u4f5c\u4e3a\u5b89\u5168\u7684\u4e00\u4e2a\u8bdd\u9898\uff1apostMessage\u3001origin location......

"},{"location":"docs/2022/08/06/#4-csp","title":"4. \u4e3a\u4ec0\u4e48\u6211\u5728\u4f60\u7684\u7f51\u7ad9\u4e0a\u770b\u4e0d\u5230 CSP","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://drewjarrett.medium.com/why-cant-i-see-a-content-security-policy-on-your-website-d1b5ba064ea3

  • \u5b8c\u5168\u4e0d\u77e5\u9053 CSP \u662f\u5565\u3002
  • \u89c9\u5f97\u5f88\u6df7\u4e71\uff0c\u6709\u90a3\u4e48\u591a\u9632\u6b62 XSS \u7684\u624b\u6bb5\u3002
  • \u4e00\u76f4\u5728\u59a8\u788d\u8425\u9500\uff08\uff08\uff1a \u4f8b\u5982\u5e7f\u544a\u4f4d\u8d44\u6e90\u7684\u52a0\u8f7d\u7b49\uff09\uff0c\u5fc5\u987b\u8bbe\u7f6e src \u767d\u540d\u5355\u624d\u80fd\u6b63\u786e\u52a0\u8f7d
  • ......
"},{"location":"docs/2022/08/06/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

\u8fd9\u4e2a\u661f\u671f\u6bd4\u8f83\u5fd9\u788c\uff0c\u5de5\u4f5c\u4e4b\u4f59\u7684\u65f6\u95f4\u5728\u770b\u4e00\u4e9b\u5df2\u7ecf\u6de1\u5fd8\u6216\u8005\u6a21\u7cca\u7684\u5185\u5bb9\u3002

\u9884\u8ba1\u4e0b\u4e2a\u661f\u671f\u6062\u590d\u6b63\u5e38\uff0c\u57fa\u672c\u6bcf\u4e2a\u6708\u90fd\u4f1a\u62bd\u4e00\u4e2a\u661f\u671f\u53bb\u590d\u4e60\u770b\u91cd\u8981\u7684\u77e5\u8bc6\u3002

\u4f5c\u4e3a\u53cb\u94fe\uff0c\u5bf9\u9f50\u4e00\u4e0b\u5927\u4f6c\u5468\u520a\uff1a rottenpen's FE News

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2022/09/07/","title":"Scholar's Weekly \u7b2c7\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a typescript\u3001antd\u3001chrome

"},{"location":"docs/2022/09/07/#1-typescript-48","title":"1. Typescript 4.8 \u53d1\u5e03\u4e86","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://devblogs.microsoft.com/typescript/announcing-typescript-4-8/

\u987a\u5e26\u4e00\u63d0\uff0c\u540e\u7eed\u7684\u53d1\u7248\u8ba1\u5212\u3002

"},{"location":"docs/2022/09/07/#2-chrome-react","title":"2. \u4ece Chrome \u8f7b\u677e\u68c0\u6d4b React \u7ec4\u4ef6\u6e90\u4ee3\u7801\uff01","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/hand-dot/react-inspector

"},{"location":"docs/2022/09/07/#3-antd-50-tour","title":"3. Antd 5.0 \u51c6\u5907\u53d1\u5e03 Tour \u7ec4\u4ef6","text":"

\u4e0e\u6b64\u540c\u65f6\uff0c\u8fd9\u91cc\u7b80\u5355\u4ecb\u7ecd\u53e6\u5916\u4e00\u4e2a\u5f15\u5bfc\u5f0f\u7ec4\u4ef6 react-shepherd

\u76f8\u5173\u5730\u5740\uff1a

  • https://github.com/ant-design/ant-design/discussions/37712
  • https://github.com/shipshapecode/react-shepherd
"},{"location":"docs/2022/09/07/#4-nodejs","title":"4. \u8de8\u5e73\u53f0\u7684 node.js \u5e94\u7528\u7a0b\u5e8f\u6307\u5f15","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/ehmicky/cross-platform-node-guide/blob/main/docs/summary.md

"},{"location":"docs/2022/09/07/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

\u5f88\u62b1\u6b49\uff0c\u5468\u520a\u4f11\u520a\u4e86 3 \u671f\uff0c\u4e2d\u9014\u53bb\u505a\u4e86\u4e00\u4e9b\u4e8b\uff0c\u60f3\u4e86\u4e00\u4e9b\u4e1c\u897f\uff0c\u51c6\u5907\u505a\u4e00\u4e9b\u4e1c\u897f\u3002

\u597d\u4e86\uff0c\u5e9f\u8bdd\u4e0d\u591a\u8bf4\uff0c\u540e\u9762\u7684\u5468\u520a\u6211\u4f1a\u5c3d\u91cf\u575a\u6301\uff0c\u4fdd\u6301\u4e0d\u4f11\u520a\u3002

\u672c\u5468\u4e3b\u8981\u5f00\u53d1\u4e86\u4e24\u4e2a\u5de5\u5177\u5305\uff1a

  • @montagejs/issue-cert-plus
  • @montagejs/issue-cert

plus \u7248\u672c\u4e3b\u8981\u89e3\u51b3\u4e86\u8de8\u5e73\u53f0\u7cfb\u7edf\u7684\u8bc1\u4e66\u81ea\u52a8\u6388\u4fe1\u80fd\u529b\uff0c\u540e\u8005\u5219\u662f\u7eaf\u7684\u8bc1\u4e66\u751f\u6210\u3002

montagejs \u7684\u6587\u6863\u5de5\u5177\u5f15\u64ce\uff0c\u4ece dumi \u8fc1\u79fb\u5230\u4e86 docusaurus\u3002\u4e3b\u8981\u89e3\u51b3\u4e86\u4ee5\u4e0b\u51e0\u4e2a\u95ee\u9898\uff1a

  • dev \u6a21\u5f0f\u5f88\u6162\uff1b
  • \u5bf9\u539f\u59cb\u7684 monorepo \u7684\u521d\u59cb\u914d\u7f6e\u4fb5\u5165\u5f88\u5927\uff1b
  • MDX \u7684\u8bed\u6cd5\u539f\u751f\u652f\u6301\uff1b

\u53ef\u4ee5\u7b80\u5355\u4f53\u9a8c\u4e0b\uff1a\u6587\u6863\u5730\u5740

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2022/10/08/","title":"Scholar's Weekly \u7b2c8\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a typescript\u3001stc\u3001k8s\u3001pdf2docx\u3001rust

"},{"location":"docs/2022/10/08/#1-stc","title":"1. stc","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/dudykr/stc

\u4e00\u6b3e\u65b0\u7684\uff1aSpeedy TypeScript type checker\u3002

\u8fd8\u662f\u5f88\u671f\u5f85\u7684\uff0c\u6838\u5fc3\u8d21\u732e\u8005\u6765\u81ea swc \u4f5c\u8005\uff0c\u5927\u4f53\u91cf\u7684\u9879\u76ee\u7ecf\u5386 type checker \u7684\u65f6\u5019\uff0c\u6210\u4e3a\u4e86\u9879\u76ee\u6253\u5305\u7f16\u8bd1\u7684\u963b\u585e\u70b9\uff0c\u5e95\u5c42\u7531 rust \u7f16\u5199\uff0c\u6027\u80fd\u4e0a\u5e94\u8be5\u4f1a\u6709\u5927\u5e45\u5ea6\u7684\u63d0\u5347\u3002

"},{"location":"docs/2022/10/08/#2-vite-vs-next-turbopack-hmr-benchmark","title":"2. Vite vs. Next + turbopack HMR Benchmark","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/yyx990803/vite-vs-next-turbo-hmr

\u5c24\u5927\u5bf9\u6bd4\u4e86\u65b0\u51fa\u7684\u7ade\u54c1 turbopack\uff0c\u5728 hmr \u4e0a\u505a\u4e86 diff\uff0c\u7559\u4e0b\u4e86\u540e\u9762\u7684\u7ed3\u8bba\uff1a

  • The Next RSC numbers are only included for reference (compare between server/client HMR in Next).
  • For the root component (big with many imports and child components), Vite and Next + turbopack are almost equally fast.
  • For the leaf component (small, no imports), Next + turbopack is about 68% faster.
  • This is quite far from the claim that \"turbopack is 10x faster than Vite\" as we've seen from Vercel's marketing materials.
"},{"location":"docs/2022/10/08/#3-kubernetes-tutorials","title":"3. Kubernetes Tutorials","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/guangzhengli/k8s-tutorials

\u987e\u540d\u601d\u4e49\uff0c\u514d\u8d39\u7684 k8s \u6559\u7a0b\u5730\u5740\u3002

"},{"location":"docs/2022/10/08/#4-pdf2docx","title":"4. pdf2docx","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/dothinking/pdf2docx

\u4e00\u6b3e\u7531 python \u7f16\u5199\u7684 pdf \u8f6c docs \u5de5\u5177\u3002

"},{"location":"docs/2022/10/08/#5-atuin","title":"5. atuin","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/ellie/atuin

Atuin \u4f7f\u7528 SQLite \u6570\u636e\u5e93\u53d6\u4ee3\u4e86\u4f60\u73b0\u6709\u7684 shell \u5386\u53f2\uff0c\u5e76\u4e3a\u4f60\u7684\u547d\u4ee4\u8bb0\u5f55\u4e86\u989d\u5916\u7684\u5185\u5bb9\u3002\u6b64\u5916\uff0c\u5b83\u8fd8\u901a\u8fc7 Atuin \u670d\u52a1\u5668\uff0c\u5728\u673a\u5668\u4e4b\u95f4\u63d0\u4f9b\u53ef\u9009\u7684\u3001\u5b8c\u5168\u52a0\u5bc6\u7684\u5386\u53f2\u8bb0\u5f55\u540c\u6b65\u529f\u80fd\u3002

\u4e3a\u9891\u7e41\u4f7f\u7528\u7684 shell \u547d\u4ee4\u505a history \u8bb0\u5f55\uff0c\u86ee\u6709\u7528\u7684\u5de5\u5177\u3002

"},{"location":"docs/2022/10/08/#6-this-week-in-rust","title":"6. this-week-in-rust","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://this-week-in-rust.org

Rust \u6bcf\u5468\u66f4\u65b0\u6458\u8981\uff5e

"},{"location":"docs/2022/10/08/#end","title":"End","text":"

\u6700\u540e\uff0c\u7b80\u5355\u603b\u7ed3\u4e0b\u8fd9\u4e00\u4e2a\u661f\u671f\u7684\u4fee\u70bc\u5185\u5bb9\uff5e

  • pangu \u5728\u7ecf\u5386\u4e86\u51e0\u4e2a\u7248\u672c\u7684\u8fed\u4ee3\u540e\uff0c\u7ec8\u4e8e\u53ef\u4ee5\u6295\u5165\u751f\u4ea7\u6b63\u5f0f\u4f7f\u7528\u4e86\u3002

    \u76ee\u524d roadmap \u5b8c\u6210\u7684\u6838\u5fc3\u529f\u80fd\uff5e

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/02/09/","title":"Scholar's Weekly \u7b2c9\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a jotai\u3001AnimeGANv2\u3001CssInJs\u3001pipe

"},{"location":"docs/2023/02/09/#1-jotai-v2","title":"1. jotai \u53d1\u5e03 V2 \u7248\u672c","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/pmndrs/jotai/releases/tag/v2.0.0

\u5927\u6982\u770b\u4e86\u4e0b\uff0cjotai \u6709\u8fd9\u4e48\u51e0\u4e2a\u53d8\u52a8\u70b9\uff1a

New Features

  • jotai/vanilla\uff0c\u652f\u6301\u975e React \u5e94\u7528\u7684\u4f7f\u7528\uff1b
  • \u65b0\u589e\u4e86 createStore\uff0c\u66f4\u52a0\u7075\u6d3b\u7684\u64cd\u4f5c\u539f\u5b50\uff1b
  • atom \u7684\u5199\u64cd\u4f5c\u66f4\u52a0\u4fbf\u6377\u4e86\uff1b
    const a = atom(\n  (get) => get(),\n  (get, set, arg1, arg, ...rest) => {\n    return 0;\n  }\n)\n

Break Changes

  • Provider \u7684 initialValuesprop \u88ab\u79fb\u9664\uff0c\u56e0\u4e3a store \u5b83\u66f4\u7075\u6d3b\uff1b
  • Provider \u7684\u8303\u56f4\u5c5e\u6027\u88ab\u5220\u9664\uff0c\u56e0\u4e3a\u4f60\u53ef\u4ee5\u521b\u5efa\u81ea\u5df1\u7684\u4e0a\u4e0b\u6587\uff1b
  • abortableAtomutil \u5df2\u5220\u9664\uff0c\u56e0\u4e3a\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5305\u542b\u8be5\u529f\u80fd\uff1b
  • waitForAllutil \u5df2\u5220\u9664\uff0c\u56e0\u4e3a Promise.all \u5b83\u53ef\u4ee5\u6b63\u5e38\u5de5\u4f5c\uff1b
"},{"location":"docs/2023/02/09/#2","title":"2. \u4e00\u4e2a\u597d\u73a9\u7684\u5728\u7ebf\u56fe\u7247\u8f6c\u52a8\u6f2b\u7684\u5de5\u5177","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://huggingface.co/spaces/akhaliq/AnimeGANv2

"},{"location":"docs/2023/02/09/#3-ant-design-v5-cssinjs","title":"3. Ant Design V5 \u5e94\u7528\u7ea7 CSSinJS \u89e3\u51b3\u65b9\u6848","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/ant-design/ant-design/discussions/40489

\u57fa\u4e8e AntD V5 \u4e2d\u6240\u4f7f\u7528\u7684 token Sys \u76f8\u7ed3\u5408\u7684 CSSInJS \u65b9\u6848\uff1b

\u53ef\u4ee5\u4f5c\u4e3a\u7ec3\u4e60\uff0c\u5c0f\u5c1d\u4e00\u4e0b\u5b50\u3002

"},{"location":"docs/2023/02/09/#4-css-in-js","title":"4. Css In Js\u7b80\u4ecb","text":"

\u76f8\u5173\u5730\u5740: https://www.infoworld.com/article/3678950/intro-to-css-in-js-generating-css-from-javascript.html

\u6587\u7ae0\u8be6\u5c3d\u4ecb\u7ecd\u4e86\u5404\u79cd CSSInJs \u5e93\uff0c\u5e76\u9610\u8ff0\u4e86\u5404\u79cd\u8fb9\u754c\u573a\u666f\u3002

\u603b\u7ed3\uff1aCSSInJs \u5e76\u975e\u5fc5\u987b\u3002

\u7b14\u8005\u8ba4\u540c\u4f5c\u8005\u89c2\u70b9\uff0c\u5b83\u6709\u81ea\u5df1\u7684\u9002\u7528\u573a\u666f\uff0c\u4f46\u975e\u901a\u7528\u573a\u666f\u3002

"},{"location":"docs/2023/02/09/#5-js","title":"5. JS \u7ba1\u9053\u8fd0\u7b97\u7b26","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://2ality.com/2022/01/pipe-operator.html

\u6709\u4e86 rx.js \u7684\u4f7f\u7528\u7ecf\u9a8c\u540e\uff0c\u6108\u52a0\u4e60\u60ef\u8fd9\u79cd pipe \u6d41\u7684\u5f62\u5f0f\u505a\u5f00\u53d1\u3002

const y = h(g(f(x))); // no pipe\nconst y = x |> f(%) |> g(%) |> h(%); // Hack pipe\nconst y = x |> f |> g |> h; // F# pipe\n

\u7ee7\u6d0b\u8471\u5d4c\u5957\u4e4b\u540e\u7684 pipe hack\u3002\u5988\u5988\u518d\u4e5f\u4e0d\u7528\u62c5\u5fc3\u4e0d\u4f1a curry \u5316 hack \u4e86\u3002

"},{"location":"docs/2023/02/09/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/02/10/","title":"Scholar's Weekly \u7b2c10\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5173\u952e\u8bcd\uff1a Event\u3001commander\u3001WebComponents\u3001structura

"},{"location":"docs/2023/02/10/#1-youve-got-options-for-removing-event-listeners","title":"1. You\u2019ve Got Options for Removing Event Listeners","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.macarthur.me/posts/options-for-removing-event-listeners

\u4f5c\u8005\u8be6\u5c3d\u4ecb\u7ecd\u4e86\u96c6\u4e2d\u53d6\u6d88\u4e8b\u4ef6\u7684\u65b9\u6848\uff1a

  • \u4fdd\u6301\u76f8\u540c\u5165\u53c2\u7684\u5f15\u7528\u4e0d\u53d8\uff0c\u53ef\u4ee5\u53d6\u6d88\u8bf7\u6c42\u3002
    const myCallback = () => {\nconsole.log('clicked!');\n};\n\ndocument.getElementById('button').addEventListener('click', myCallback);\ndocument.getElementById('button').removeEventListener('click', myCallback);\n
  • \u501f\u52a9 AbortController \u53d6\u6d88\u8bf7\u6c42\uff1b
    const button = document.getElementById('button');\nconst controller = new AbortController();\nconst { signal } = controller;\n\nbutton.addEventListener('click', () => console.log('clicked!'), { signal });\n\n// Remove the listener!\ncontroller.abort();\n

\u4e0d\u5f97\u4e0d\u8bf4\u7b2c\u4e8c\u79cd\u65b9\u6848\u771f\u7684\u86ee\u4ee4\u4eba\u8033\u76ee\u4e00\u65b0\u7684\uff5e

"},{"location":"docs/2023/02/10/#2-commanderjs-v10","title":"2. commander.js V10 \u53d1\u5e03","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/tj/commander.js/releases

V10 \u7248\u672c\u7684\u53d8\u5316\u86ee\u5927\u7684\uff0c\u6700\u5927\u7684 Break \u53d8\u66f4\u662f\u4f9d\u8d56 Node V14 \u53ca\u66f4\u9ad8\u7684\u7248\u672c\u3002

"},{"location":"docs/2023/02/10/#3-webcomponents","title":"3.\u4e00\u4e2a\u514d\u8d39\u7684 WebComponents \u6307\u5f15\u6559\u7a0b","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://htmlwithsuperpowers.netlify.app/

\u5982\u679c\u60f3\u8981\u4e86\u89e3 WebComponents \u76f8\u5173\u7684\u77e5\u8bc6\uff0c\u662f\u4e00\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002

"},{"location":"docs/2023/02/10/#4-async-typemodule-css-js","title":"4. \u501f\u52a9 async \u548c type='module' \u963b\u6b62 css \u963b\u585e js \u7684\u52a0\u8f7d","text":"

\u76f8\u5173\u5730\u5740: https://calendar.perfplanet.com/2022/using-inline-javascript-modules-to-prevent-css-blockage

<script type=\"module\" async>\n// todo some js code\n</script>\n

waw! \u6700\u4f73\u5b9e\u8df5......

"},{"location":"docs/2023/02/10/#5-lib-structurajs","title":"5. \u65b0 lib \u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784 structura.js","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://giusepperaso.github.io/structura.js

\u5728\u8fd9\u4e9b\u60c5\u51b5\u4e0b\u4f7f\u7528 Sructura \u800c\u4e0d\u662f Immer\uff1a

  • \u6027\u80fd\u5bf9\u60a8\u5f88\u91cd\u8981
  • \u4e0d\u53ef\u53d8\u72b6\u6001\u6b63\u5728\u6210\u4e3a\u60a8\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u74f6\u9888
  • \u60a8\u5fc5\u987b\u5904\u7406\u7684\u72b6\u6001\u5728\u65e0\u670d\u52a1\u5668\u529f\u80fd\u6216\u4e91\u4e2d\u53ef\u80fd\u975e\u5e38\u5de8\u5927\u548c\u590d\u6742\uff0c\u56e0\u4e3a\u60a8\u5e0c\u671b\u5c3d\u53ef\u80fd\u51cf\u5c11\u4f7f\u7528\u7684\u8d44\u6e90\u5faa\u73af\u5e76\u4e14\u60a8\u7684\u72b6\u6001\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u5f15\u7528\uff0c\u6240\u4ee5\u60a8\u4e0d\u5e0c\u671b\u9650\u5236\u751f\u4ea7\u8005\u7684\u8fd4\u56de\u7c7b\u578b\u4fee\u6539\u8349\u7a3f\u5e76\u8fd4\u56de\u5b83\u7684\u4e00\u90e8\u5206\u5728\u9700\u8981\u540c\u4e00\u4e2a\u751f\u4ea7\u8005\u7684\u60c5\u51b5\u4e0b
  • \u60a8\u4e0d\u60f3\u8003\u8651\u542f\u7528/\u7981\u7528\u529f\u80fd
  • \u60a8\u53ef\u80fd\u9700\u8981\u4e5f\u53ef\u80fd\u4e0d\u9700\u8981\u5206\u53c9\u5e93\u6765\u4f7f\u5176\u9002\u5e94\u60a8\u7684\u7528\u4f8b\uff0c\u56e0\u4e3a\u4ee3\u7801\u5f88\u5c0f\uff0c\u5f88\u5bb9\u6613\u63a8\u7406
"},{"location":"docs/2023/02/10/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/02/11/","title":"Scholar's Weekly \u7b2c11\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/02/11/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a AppSingle\u3001React\u3001Depngn\u3001Remix

"},{"location":"docs/2023/02/11/#1-appsingle-nest","title":"1. \u4f7f\u7528 AppSingle \u76d1\u63a7\u60a8\u7684 Nest \u5e94\u7528\u7a0b\u5e8f","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.appsignal.com/2023/01/30/monitoring-your-nestjs-application-with-appsignal.html

\u91cd\u8981\u7684\u4e00\u70b9\u5148\u58f0\u660e\uff1a

  • \u6536\u8d39
  • \u670d\u52a1\u5668\u5728\u8377\u5170

\u7279\u6027(\u5356\u70b9)\uff1a

\u5176\u5b9e\u6211\u4e2a\u4eba\u66f4\u63a8\u8350 skywalking\uff0c\u5f00\u6e90\u3001\u5f3a\u5927\u3001\u81ea\u90e8\u7f72\u3002

"},{"location":"docs/2023/02/11/#2-react-10","title":"2. React 10\u5468\u5e74\u7eaa\u5f55\u7247","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.youtube.com/watch?v=8pDqJVdNa44

\u56e0\u4e3a\u5728\u6cb9\u7ba1\uff0c\u4f46\u662f\u6211\u4e5f\u7b80\u5355\u81ea\u8d39\u4e0a\u4f20\u5230\u4e86\u81ea\u5df1\u7684 OSS\uff0c\u53ef\u4ee5\u81ea\u884c\u98df\u7528\u3002

"},{"location":"docs/2023/02/11/#3-depngn","title":"3. Depngn","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/upgradejs/depngn

\u68c0\u6d4b package.json \u4e2d\u7684\u4f9d\u8d56\u9879\u662f\u5426\u6ee1\u8db3\u5f53\u524d\u7684 node \u7248\u672c\uff0c\u6838\u5fc3\u539f\u7406\u4e3b\u8981\u662f\u68c0\u6d4b\u4f9d\u8d56\u9879\u5305\u5b57\u6bb5\uff1aengine\u3002

"},{"location":"docs/2023/02/11/#4-remix","title":"4. Remix: \u5168\u6808\u5f00\u53d1\u7684\u9886\u5bfc\u8005","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.infoworld.com/article/3687210/intro-to-remix-a-leader-in-full-stack-evolution.html#jump

Next \u76f8\u6bd4\u4e8e Remix \u6700\u5927\u7684\u4e0d\u540c\u662f\uff0cRemix \u4e0e React \u89e3\u8026\uff0c\u53ef\u4ee5\u96c6\u6210 solid \u3001svlete \u7b49\u5176\u5b83\u6846\u67b6\u3002

"},{"location":"docs/2023/02/11/#faq","title":"FAQ","text":""},{"location":"docs/2023/02/11/#1","title":"1. \u5982\u4f55\u89e3\u51b3\u524d\u7aef\u4e2d\u5e38\u89c1\u7684\u7ade\u6001\u95ee\u9898","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://juejin.cn/post/7128205011019890695

\u4e24\u4e2a\u7684\u65b9\u6848

  • axios \u7684 cancelToken \u53d6\u6d88\u8bf7\u6c42
  • RxJs \u7684 switchMap
"},{"location":"docs/2023/02/11/#2-rollup-webworker","title":"2. \u4f7f\u7528 rollup \u66f4\u4f18\u96c5\u7684\u4f7f\u7528 webWorker","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://justinribeiro.com/chronicle/2020/07/17/building-module-web-workers-for-cross-browser-compatibility-with-rollup/

  • Blob URL \u4f5c\u4e3a Worker() \u7684\u5185\u53c2
"},{"location":"docs/2023/02/11/#3-position-sticky","title":"3. \u8bb0\u4e00\u6b21 position: sticky \u5931\u6548\u7684\u95ee\u9898\u6392\u67e5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.cnblogs.com/coco1s/p/14180476.html

  • \u6211\u6240\u9047\u5230\u7684\u539f\u56e0\u4e2d\u6b63\u597d\u547d\u4e2d\u4e86\u7236\u5bb9\u5668\u8bbe\u7f6e\u4e86 overflow: hidden\uff0c\u4f46\u662f\u6211\u8fd9\u91cc\u7528\u4e86 overflow-x: hidden \u540c\u6837\u4e5f\u4f1a\u5931\u6548\u3002
"},{"location":"docs/2023/02/11/#4-youtube","title":"4. \u8bb0\u5982\u4f55\u4e0b\u8f7d youtube \u89c6\u9891","text":"
  • \u501f\u52a9\uff1ahttps://en.savefrom.net/ \u8f7b\u677e\u641e\u5b9a\uff5e
"},{"location":"docs/2023/02/11/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/02/12/","title":"Scholar's Weekly \u7b2c12\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/02/12/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a Performance\u3001Map\u3001DOMPurify\u3001JSON

"},{"location":"docs/2023/02/12/#1-a-0-x-is-about-3-10x-faster-than-a-x","title":"1. a = 0-x is about 3-10x faster than a = -x","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://twitter.com/mhevery/status/1626002464469323777

\u539f\u56e0\uff1aVM \u5bf9\u4e8e\u6d6e\u70b9\u6570\u5904\u7406\u6bd4\u8f83\u6162\u3002

\u53ef\u4ee5\u89c2\u6d4b\u4e0b\u76f8\u540c\u57fa\u51c6\u4e0b\u7684\u6027\u80fd\u6d4b\u8bd5\u3002

"},{"location":"docs/2023/02/12/#2-map-object","title":"2. \u591a\u7528 Map \u5c11\u7528 Object","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.builder.io/blog/maps

\u5728\u9891\u7e41\u589e\u5220\u7684\u64cd\u4f5c\u573a\u666f\u4e2d\uff0cMap \u7684\u6027\u80fd\u4f1a\u66f4\u52a0\u4f18\u8d8a\u4e8e Object\u3002

"},{"location":"docs/2023/02/12/#3-jsonstringify","title":"3. \u50cf JSON.stringify \u4e00\u6837\u5e8f\u5217\u5316/\u53cd\u5e8f\u5217\u5316\u5bf9\u8c61/\u5b57\u7b26\u4e32","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/Rich-Harris/devalue

  • \u5faa\u73af\u5f15\u7528 ( obj.self = obj)
  • \u91cd\u590d\u5f15\u7528 ( [value, value])
  • undefined, Infinity, NaN,-0
  • \u5e38\u7528\u8868\u8fbe
  • \u65e5\u671f
  • Map \u548c Set
  • BigInt
  • \u901a\u8fc7 replacers\u3001reducers \u548c revivers \u81ea\u5b9a\u4e49\u7c7b\u578b
"},{"location":"docs/2023/02/12/#4-dompurify-30","title":"4. DOMPurify 3.0","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/cure53/DOMPurify/releases

\u4e00\u4e2a\u6709\u7740 9 \u5e74\u5386\u53f2\u7684\u5904\u7406 html \u6216\u8005 svg \u7684\u5de5\u5177\uff0c\u5feb\u901f\u7684\u9884\u9632 XSS \u6f0f\u6d1e\u3002

\u521a\u521a\u53d1\u5e03\u4e86 3.0 \u7248\u672c\uff0c\u5f7b\u5e95\u53d6\u6d88\u5bf9 IE \u7684\u652f\u6301\u3002

"},{"location":"docs/2023/02/12/#faq","title":"FAQ","text":""},{"location":"docs/2023/02/12/#1-processkill-sigterm-sigkill","title":"1. \u5bf9\u4e8e process.kill() \u4e2d SIGTERM \u548c SIGKILL \u6700\u63a8\u8350\u7528\u8c01","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.linuxrumen.com/cyml/1667.html

\u6700\u8fd1\u5728\u5904\u7406\u5b50\u8fdb\u7a0b\u76f8\u5173\u7684\u5185\u5bb9\uff0c\u5bf9\u4e8e\u4fe1\u53f7\u7684\u4f20\u9012\u5b58\u6709\u7591\u95ee\uff0c\u6700\u7ec8\u8c03\u7814\u5f97\u5230\u7684\u6700\u4f73\u65b9\u5f0f\u662f\u9ed8\u8ba4\uff0c\u4ec0\u4e48\u90fd\u4e0d\u4f20\u5c31\u662f SIGTERM\u3002

SIGKILL \u5bb9\u6613\u5236\u9020\u51fa\u50f5\u5c38\ud83e\udddf\u8fdb\u7a0b\uff0c\u56e0\u4e3a\u8fdb\u7a0b\u5982\u679c\u5361\u6b7b\uff0c\u4f46\u662f\u53c8\u6536\u5230\u4e86 kill \u547d\u4ee4\uff0c\u90a3\u4e48\u4f1a\u4e00\u76f4\u5e38\u9a7b\u5728\u5185\u5b58\u4e2d\uff0c\u6210\u4e3a\ud83e\udddf\u8fdb\u7a0b\u3002

"},{"location":"docs/2023/02/12/#2-the-inferred-type-of-x-cannot-be-named-without-a-reference-to-y","title":"2. The inferred type of \"X\" cannot be named without a reference to \"Y\".","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/microsoft/TypeScript/issues/42873

pnpm \u9879\u76ee\u4e2d\u83ab\u540d\u51fa\u73b0\u6807\u9898\u62a5\u9519\u3002

\u5728 tsconfig.json \u4e2d\u6dfb\u52a0\uff1a

\"preserveSymlinks\": true\n

"},{"location":"docs/2023/02/12/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/03/13/","title":"Scholar's Weekly \u7b2c13\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/03/13/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a RTL\u3001Pnpm\u3001Atom\u3001Prerender

"},{"location":"docs/2023/03/13/#1migrating-rtl-by-sentry","title":"1.Migrating RTL---By Sentry","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.sentry.io/2023/02/23/sentrys-frontend-tests-migrating-from-enzyme-to-react-testing-library/

Sentry \u56e2\u961f\uff0c\u7ed3\u5408\u81ea\u8eab\u4ea7\u54c1\uff0c\u9610\u8ff0\u4e86\u4ece Enzyme \u8fc1\u79fb RTL \u7684\u8bf8\u591a\u53d7\u76ca\uff1a\u672c\u7279\u70b9\u4e0d\u518d\u63d0\u4f9b\u4e2d\u6587\u7ffb\u8bd1

  • Enzyme has no plans to support React 18. Where RTL does not rely on React\u2019s internals. and would continue to work the same with React 18 as it did with 16 and 17. (note: there is an unofficial adapter for React 18, but it is not actual, full support).
  • Enzyme had only basic support for testing React Hooks.
  • An adapter for our tests to work with React would no longer be needed.
  • RTL does better accessibility tests by providing role-based selectors.
  • RTL avoids some of the pitfalls we ran into with Enzyme like not unmounting components between tests (slow) and directly modifying component state (poor test hygiene).
  • RTL is now the more popular choice on npm for testing React components, likely because enzyme doesn\u2019t directly support the latest version of React.
"},{"location":"docs/2023/03/13/#2pnpm-7290","title":"2.Pnpm 7.29.0","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/pnpm/pnpm/releases/tag/v7.29.0-0

\u652f\u6301\u4e86 dedupe-peer-dependents\uff0c\u53ef\u4ee5\u6309\u9879\u76ee\u9002\u5ea6\u5f00\u542f\uff1a - \u8981\u6c42\u7248\u672c\u76f8\u540c\uff0c\u5219\u5f00\u542f\uff0c\u6bd4\u5982 react\u3001react-dom\u3002 - \u8981\u6c42\u7248\u672c\u4e0d\u540c\uff0c\u5219\u5173\u95ed\u3002

"},{"location":"docs/2023/03/13/#3-ui-react","title":"3.\u4f7f\u7528\u5df2\u5efa\u7acb\u7684 UI \u6a21\u5f0f\u6a21\u5757\u5316 React \u5e94\u7528\u7a0b\u5e8f","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://martinfowler.com/articles/modularizing-react-apps.html

\u5206\u5c42\u524d\u7aef\u7684\u5408\u7406\u6027\u518d\u6b21\u88ab\u8bc1\u5b9e\uff0c\u4e5f\u662f\u7b14\u8005\u4e00\u76f4\u4ee5\u6765\u575a\u6301\u270a\u7684\u5199\u6cd5\uff0c\u5c06\u9875\u9762\u539f\u5b50\u5316\uff0c\u7ec6\u5316\u5230\u6bcf\u4e00\u4e2a\u7ec4\u4ef6\u3002

"},{"location":"docs/2023/03/13/#4prerender-pages-in-chrome-for-instant-page-navigations","title":"4.Prerender pages in Chrome for instant page navigations","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://developer.chrome.com/blog/prerender-pages/

\u4e00\u79cd\u65b0\u7684\u5b8c\u6574\u7684\u9884\u6e32\u67d3\u673a\u5236NoState Prefetch \u5373\u5c06\u53d6\u4ee3 rel=prerender\u3002\u53ef\u4ee5\u6682\u65f6\u5173\u6ce8\u4e0b\uff0c\u4f46\u662f\u73b0\u9636\u6bb5\u8c8c\u4f3c\u610f\u4e49\u4e0d\u5927\u3002

"},{"location":"docs/2023/03/13/#faq","title":"FAQ","text":""},{"location":"docs/2023/03/13/#1react-qrcode-logo","title":"1.react-qrcode-logo","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/gcoro/react-qrcode-logo

\u6700\u8fd1\u6b63\u597d\u7528\u5230\u8fd9\u79cd\u5b9a\u5236\u5316 QR.Code \u751f\u6210\u5de5\u5177\u3002

"},{"location":"docs/2023/03/13/#2sonner","title":"2.Sonner","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/emilkowalski/sonner

\u7f8e\u800c\u8212\u9002\u7684 `Toast`` \u7ec4\u4ef6\uff5e

"},{"location":"docs/2023/03/13/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/03/14/","title":"Scholar's Weekly \u7b2c14\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/03/14/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a FinalizationRegistry\u3001GC\u3001SITE GENERATOR\u3001pronouns\u3001Toolbox

"},{"location":"docs/2023/03/14/#1finalizationregistry","title":"1.FinalizationRegistry","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry

\u900f\u8fc7\u4f7f\u7528 JavaScript \u5783\u573e\u6536\u96c6\u5668\u8fdb\u884c\u5b9e\u9a8c\u8fd9\u7bc7\u6587\u7ae0\uff0c\u4e86\u89e3\u4e86\u4e00\u4e2a\u65b0\u7684 FinalizationRegistry \u7c7b\uff0c\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u8fdb\u884c\u68c0\u6d4b\u5bf9\u8c61\u4f55\u65f6\u88ab\u5783\u573e\u6536\u96c6\u3002\u5b83\u9002\u7528\u4e8e\u6240\u6709\u4e3b\u8981\u7684 web \u6d4f\u89c8\u5668\u548c Node.js\u3002

"},{"location":"docs/2023/03/14/#2the-javascript-site-generator-review-2023","title":"2.THE JAVASCRIPT SITE GENERATOR REVIEW, 2023","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.zachleat.com/web/site-generator-review/

  • Astro 2.0.15
  • Eleventy 2.0.0
  • Enhance 1.4.6 (added 27 February 2023)
  • Gatsby 5.7.0
  • Next.js 13.2.1
  • Nuxt 3.2.2
  • Remix 1.13.0
  • SvelteKit 1.8.3

\u4ee5\u4e0a\u662f\u4e00\u4e9b\u9759\u6001\u7ad9\u70b9\u751f\u6210\u5668\uff0c\u4f5c\u8005\u5206\u522b\u4ece install times\u3001client bundle size\u3001node_modules weight\u3001npm auditing \u7b49\u51e0\u4e2a\u89d2\u5ea6\u8fdb\u884c\u4e86\u5de5\u5177\u5bf9\u6bd4\u3002

"},{"location":"docs/2023/03/14/#3add-pronouns-to-your-github-profile","title":"3.Add pronouns to your GitHub profile","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.blog/changelog/2023-03-01-add-pronouns-to-your-github-profile/

Github \u652f\u6301\u8bbe\u7f6e \u4ee3\u8bcd \u4e86\uff0c\u82f1\u6587\u4e2d\u53ef\u4ee5\u7528\u4ee3\u8bcd they\u3001her\u3001he \uff0c\u4e2d\u6587\u4e2d\u6211\u7406\u89e3\u5c31\u6bd4\u8f83\u968f\u610f\u4e86\uff0c\u53ef\u4ee5\u662f\u81ea\u5df1\u6216\u8005\u670b\u53cb\u6bd4\u8f83\u8ba4\u540c\u7684\u4ee3\u8bcd\u3002

\u4f8b\u5982\uff1a\u592b\u5b50\u3001\u543e\u3001\u541b\u3001\u537f\u3001\u5ab2......

"},{"location":"docs/2023/03/14/#4nodejs-toolbox","title":"4.Nodejs Toolbox","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://nodejstoolbox.com/)

\u4e00\u4e2a\u65b0\u7684\uff0c\u5bf9\u4e8e node \u4e0b\u8fd0\u884c\u7684\u5404\u79cd\u5de5\u5177\u7684\u5206\u7c7b\u6c47\u603b\uff0c\u5927\u6982\u770b\u4e86\u4e0b\uff0c\u5176\u5b9e\u4e0d\u662f\u5f88\u5168\uff0c\u4f46\u662f\u652f\u6301\u63d0 PR\u3002

"},{"location":"docs/2023/03/14/#52023-javascript","title":"5.2023\u5e74 JavaScript\u65b0\u8d8b\u52bf","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.jamesqquick.com/blog/javascript-trends-2023/

\u5927\u4f53\u4e0a\u662f\u5efa\u8bae\uff0c\u5c3d\u53ef\u80fd\u7684\u5c11\u7528 JS \uff0c\u6bd4\u5982 TS\u3001\u6bd4\u5982 deno\u3001bun \u8fd0\u884c\u65f6\u7b49\u7b49\u3002

"},{"location":"docs/2023/03/14/#faq","title":"FAQ","text":""},{"location":"docs/2023/03/14/#1-ts-reset","title":"1. Ts-Reset","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/total-typescript/ts-reset

\u4e00\u4e2a\u7c7b\u4f3c CSS Reset \u7684\u5de5\u5177\u3002

TypeScript\u5185\u7f6e\u7684\u7c7b\u578b\u5b9a\u4e49\u5e76\u4e0d\u5b8c\u7f8e\u3002ts-reset\u53ef\u4ee5\u8ba9\u5b83\u4eec\u53d8\u5f97\u66f4\u597d\u3002

Good Job!

"},{"location":"docs/2023/03/14/#2-12px","title":"2. \u5982\u4f55\u7a81\u7834\u6d4f\u89c8\u5668\u9650\u5236\uff0c\u8bbe\u7f6e\u5c0f\u4e8e 12px \u7684\u5b57\u53f7\uff1f","text":"
.parent {\nfont-size: 12px;\n.child {\nfont-size: 11px; // want set\ntransform: scale(11/12);\ntransform-origin: left center; // important\uff0c\u76ee\u7684\u662f\u5c45\u5de6\u5782\u76f4\u5c45\u4e2d\n}\n}\n
"},{"location":"docs/2023/03/14/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/03/15/","title":"Scholar's Weekly \u7b2c15\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/03/15/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a typescript\u3001watch\u3001react

"},{"location":"docs/2023/03/15/#1-typescript-50","title":"1. TypeScript 5.0","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://devblogs.microsoft.com/typescript/announcing-typescript-5-0/

TypeScript 5.0 \u6b63\u5f0f\u53d1\u5e03\uff1a

\u529f\u80fd\u901f\u89c8\uff1a

  • Decorators
  • const Type Parameters
  • Supporting Multiple Configuration Files in extends
  • All enums Are Union enums
  • --moduleResolution bundler
  • Resolution Customization Flags
  • --verbatimModuleSyntax
  • Support for export type *
  • @satisfies Support in JSDoc
  • @overload Support in JSDoc
  • Passing Emit-Specific Flags Under --build
  • Case-Insensitive Import Sorting in Editors
  • Exhaustive switch/case Completions
  • Speed, Memory, and Package Size Optimizations
  • Breaking Changes and Deprecations
"},{"location":"docs/2023/03/15/#2-turbowatch","title":"2. turbowatch","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/gajus/turbowatch

\u4e00\u4e2a\u65b0\u7684\u6709\u610f\u601d\u7684\u5de5\u5177 turbowatch\uff0c\u5b83\u662f\u7528\u4e8e\u76d1\u542c\u6307\u5b9a\u7684\u6587\u4ef6\u53d8\u5316\uff0c\u91cd\u542f\u670d\u52a1\u7684\u3002

\u901a\u5e38\u5728 cli \u5de5\u5177\u5f00\u53d1\u4e2d\u5f88\u6709\u7528\u3002\u540c\u7c7b\u7684\u8fd8\u6709 nodemon\u3002

\u5f53\u7136\uff0c\u5982\u679c\u60f3\u5b9e\u73b0\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u53ef\u4ee5\u501f\u52a9\uff1achokidar\u3002\u5177\u4f53\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\uff1a\u5efa\u7acb\u4f60\u81ea\u5df1\u7684 nodemon

"},{"location":"docs/2023/03/15/#3-react","title":"3. React \u7684\u672a\u6765","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://changelog.com/jsparty/267

\u770b\u8d77\u6765\u6700\u7ec8\u7684\u7ed3\u679c\u5bfc\u5411\u7684\u662f server \uff0c\u4e5f\u5c31\u662f ssr\u3001ssr component\u3002

"},{"location":"docs/2023/03/15/#4-20typescript","title":"4. 20\u4e2aTypeScript\u5f00\u53d1\u7684\u6700\u4f73\u5b9e\u8df5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://itnext.io/mastering-typescript-21-best-practices-for-improved-code-quality-2f7615e1fdc3

"},{"location":"docs/2023/03/15/#faq","title":"FAQ","text":""},{"location":"docs/2023/03/15/#1-ios-css","title":"1. IOS \u4e0d\u517c\u5bb9\u7684 CSS \u5c5e\u6027","text":"

\u4e3b\u8981\u7684\u95ee\u9898\u5c31\u662f\uff0c\u4e0a\u4e0b\u6eda\u52a8\uff0c\u518d\u6b21\u6eda\u52a8\u4e0a\u53bb\uff0c\u80cc\u666f\u56fe\u7247\u4f1a\u4e22\u5931\u3002

body {\nbackground-image: url(\"xxx\");\nbackground-attachment: fixed; // ios \u8bbe\u5907\u4e0d\u517c\u5bb9\uff0c\u6ce8\u610f\u907f\u5751\n}\n
"},{"location":"docs/2023/03/15/#2-driverjs-iphone-14-pro","title":"2. driver.js \u5728 iphone 14 pro \u673a\u578b\u4f1a\u5b9a\u4f4d\u9519\u4f4d\u3002","text":"

\u89e3\u51b3\u529e\u6cd5\u5c31\u662f\uff1a\u624b\u64b8\u4e00\u4e2a\u5f15\u5bfc\u7ec4\u4ef6\u3002

\u5927\u6982\u601d\u8def\uff1a\u501f\u52a9 z-index \u5c42\u7ea7\u5173\u7cfb\u3002

"},{"location":"docs/2023/03/15/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/03/16/","title":"Scholar's Weekly \u7b2c16\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/03/16/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a React\u3001GTPT4\u3001bun\u3001astro

"},{"location":"docs/2023/03/16/#1how-to-start-a-react-project-in-2023","title":"1.How to start a React Project in 2023","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.robinwieruch.de/react-starter/

\u5173\u4e8e\u5728 2023 \u5e74\u5982\u4f55\u5f00\u59cb React \u9879\u76ee\uff0c\u4f5c\u8005\u5bf9\u4e8e\u57fa\u7840\u7684\u5f00\u53d1\u8005\u7684\u5efa\u8bae\u662f\uff0c\u4ece vite + react \u5f00\u59cb\uff0c\u56e0\u4e3a\u5b83\u5e95\u5c42\u66f4\u5feb\uff08esbuild\uff09\u3002

\u4f46\u662f\u4f5c\u4e3a Vue \u7684\u6838\u5fc3\u652f\u6301\u8005\uff0cReact \u5e76\u4e0d\u662f\u7b2c\u4e00\u4f18\u5148\u7ea7\uff0c\u6240\u4ee5\u5c31\u610f\u5473\u7740\uff0cSRC \u670d\u52a1\u7aef\u6e32\u67d3\u7ec4\u4ef6\u6210\u4e3a\u4e86\u4e00\u79cd \u5962\u671b\u3002

"},{"location":"docs/2023/03/16/#2","title":"2.\u524d\u7aef\u5de5\u7a0b\u5e08\u7684\"\u5669\u8017\"\uff1f","text":"

\u76f8\u4fe1 GPT4 \u4e3a\u4e00\u90e8\u5206\u4eba\uff0c\u5305\u62ec\u6211\u5728\u5185\u7684\u5e26\u6765\u4e86\u4e00\u4e9b\u9707\u64bc\uff0c\u4f46\u662f\u5c31\u50cf\u4ece\u4e1a\u52a1\u3001\u5de5\u7a0b\u89d2\u5ea6\u800c\u8a00\uff0c\u4ece\u751f\u4ea7\u7684\u4e25\u8c28\u6027\u4e0a\u770b\uff0cAI \u53d6\u4ee3\u4eba\u7c7b\u51e0\u4e4e\u662f\u4e0d\u53ef\u80fd\u7684\uff0c\u552f\u4e00\u7684\u7ed3\u8bba\u5c31\u662f \u589e\u5f3a\u3002

"},{"location":"docs/2023/03/16/#3ts-nodebun","title":"3.\u4ecets-node\u8fc1\u79fb\u5230bun","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://johnnyreilly.com/migrating-from-ts-node-to-bun

"},{"location":"docs/2023/03/16/#4astrojs","title":"4.Astro.js \u6307\u5357","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://bejamas.io/blog/practical-guide-to-astro-js-framework

"},{"location":"docs/2023/03/16/#56css","title":"5.6\u4e2a\u524d\u7aef\u5f00\u53d1\u8005\u5e94\u8be5\u77e5\u9053\u7684CSS\u7247\u6bb5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://web.dev/6-css-snippets-every-front-end-developer-should-know-in-2023/

"},{"location":"docs/2023/03/16/#6eslint-formatter-pretty","title":"6.eslint-formatter-pretty","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/sindresorhus/eslint-formatter-pretty

\u66f4\u52a0\u7cbe\u7f8e\u7684 eslint \u8f93\u51fa\uff0c\u652f\u6301 iterm\u3002

module.exports = {\nentry: ['file.js'],\nmodule: {\nrules: [\n{\ntest: /\\.js$/,\nexclude: /node_modules/,\nloader: 'eslint-loader',\noptions: {\nformatter: require('eslint-formatter-pretty')\n}\n}\n]\n}\n};\n
"},{"location":"docs/2023/03/16/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/04/17/","title":"Scholar's Weekly \u7b2c17\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/04/17/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a importmap\u3001auth\u3001npkill\u3001react

"},{"location":"docs/2023/04/17/#1-javascript-import-maps","title":"1. JavaScript Import Maps \u652f\u6301\u8de8\u6d4f\u89c8\u5668","text":"
<script type=\"importmap\">\n{\n\"imports\": {\n\"browser-fs-access\": \"https://unpkg.com/browser-fs-access@0.33.0/dist/index.modern.js\"\n}\n}\n</script>\n
<button>Select a text file</button>\n<script type=\"module\">\nimport {fileOpen} from 'browser-fs-access';\n\nconst button = document.querySelector('button');\nbutton.addEventListener('click', async () => {\nconst file = await fileOpen({\nmimeTypes: ['text/plain'],\n});\nconsole.log(await file.text());\n});\n</script>\n
"},{"location":"docs/2023/04/17/#2react","title":"2.\u5728React\u4e2d\u5b9e\u73b0\u767b\u5f55\u6388\u6743\u8ba4\u8bc1","text":""},{"location":"docs/2023/04/17/#3npkill","title":"3.npkill","text":"

\u65b0\u7684\u7248\u672c\u4e2d\uff0c\u6027\u80fd\u518d\u6b21\u63d0\u5347\uff0c\u5f00\u542f\u4e86 8\u6838 \u63d0\u901f\u3002

"},{"location":"docs/2023/04/17/#4","title":"4.\u4ee3\u7801\u9ad8\u4eae\u663e\u793a\u5de5\u5177","text":""},{"location":"docs/2023/04/17/#5-react","title":"5.\u4e00\u4e9b React \u521d\u5b66\u8005\u7ecf\u5e38\u4f1a\u51fa\u73b0\u7684\u9519\u8bef","text":"

\u4e00\u4e9b\u5e38\u89c1\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u5728\u6d4b\u8bd5\u73af\u5883\u5c31\u53d1\u73b0\u7684\uff0c\u4f46\u662f\u8fd9\u4e5f\u662f\u4e00\u79cd\u7f16\u7a0b\u4e60\u60ef\uff0c\u80fd\u5728\u7f16\u7801\u9636\u6bb5\u89e3\u51b3\u4e5f\u662f\u4e00\u79cd\u8715\u53d8\u3002

......

"},{"location":"docs/2023/04/17/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/04/18/","title":"Scholar's Weekly \u7b2c18\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/04/18/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a magicast\u3001Croner\u3001lazyrepo\u3001JSPM\u3001chrome extension

"},{"location":"docs/2023/04/18/#1croner","title":"1.Croner","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/hexagon/croner

\u662f cron \u5728 node\u3001bun\u3001deno\u3001browser \u7aef\u7684\u5b9e\u73b0\u3002

\u4ee5\u4e0b\u662f\u4e00\u4e2a\u5feb\u901f\u793a\u4f8b\uff0c\u4f5c\u4e3a\u5b9a\u4f4d job \u7684\u6267\u884c\uff0c\u662f\u76f8\u5f53\u6709\u7528\u7684\u5de5\u5177\u3002

// Basic: Run a function at the interval defined by a cron expression\nconst job = Cron('*/5 * * * * *', () => {\nconsole.log('This will run every fifth second');\n});\n\n// Enumeration: What dates do the next 100 sundays occur on?\nconst nextSundays = Cron('0 0 0 * * 7').nextRuns(100);\nconsole.log(nextSundays);\n\n// Days left to a specific date\nconst msLeft = Cron('59 59 23 24 DEC *').nextRun() - new Date();\nconsole.log(Math.floor(msLeft/1000/3600/24) + \" days left to next christmas eve\");\n\n// Run a function at a specific date/time using a non-local timezone (time is ISO 8601 local time)\n// This will run 2024-01-23 00:00:00 according to the time in Asia/Kolkata\nCron('2024-01-23T00:00:00', { timezone: 'Asia/Kolkata' }, () => { console.log('Yay!') });\n
"},{"location":"docs/2023/04/18/#2-magicast","title":"2. magicast","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/unjs/magicast

\u4e00\u4e2a\u8d85\u7ea7\u6709\u7528\u7684 \u8bed\u6cd5\u6811 \u5feb\u6377\u64cd\u4f5c\u5de5\u5177\uff0c\u53ef\u4ee5\u50cf\u5199 js \u4e00\u6837\u64cd\u4f5c\u8bed\u6cd5\u6811\u3002

"},{"location":"docs/2023/04/18/#3-lazyrepo","title":"3. lazyrepo","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/ds300/lazyrepo

\u81ea\u4ece nx.js \u548c turborepo \u63d0\u51fa\u4e86 cache build \u4e4b\u540e\u3002

lazyrepo \u7684\u4f5c\u8005\uff0c\u505a\u4e86\u7eaf\u529f\u80fd\u8fc1\u51fa\uff0c\u76ee\u524d\u8fd8\u662f build \u9636\u6bb5\uff0c\u770b\u8d77\u6765\u4e0d\u9519\uff0c\u6bd4\u8f83\u72ec\u7acb\uff0c\u72ec\u7acb\u4e8e\u4efb\u610f\u4e00\u79cd\u6846\u67b6\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e lerna-lit \u4ece lerna \u5b75\u5316\u51fa\u7684\u6700\u5c0f\u96c6\u5408\u3002

"},{"location":"docs/2023/04/18/#4-100","title":"4. \u8d85\u8fc7100\u591a\u79cd\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u7684\u4ed3\u5e93","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md

\u4e4b\u524d\u6211\u6709\u5173\u6ce8\u8fc7\uff0c\u4f46\u662f\u8fd9\u6b21\u6211\u505a\u4e86\u4e00\u4e2a\u8bb0\u5f55\uff0c\u6211\u89c9\u5f97\u4f5c\u4e3a \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 \u7684\u63a2\u7d22\u8005\uff0c\u5e94\u8be5\u8981\u6df1\u5165\u6e90\u7801\u7ea7\u522b\u770b\u4e00\u770b\u4e00\u4e9b\u597d\u7684\u6848\u4f8b\u662f\u600e\u4e48\u5199\u7684\u3002

"},{"location":"docs/2023/04/18/#5-netlify","title":"5. Netlify \u4e0a\u7684\u6846\u67b6\u6d41\u884c\u5ea6","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.netlify.com/blog/framework-popularity-on-netlify/

\u5176\u5b9e\u7ed3\u679c\u5df2\u7ecf\u5f88\u660e\u663e\u4e86\uff0c\u4ece 2020 \u5230 2022 \u7684\u6846\u67b6\u6d41\u884c\u5ea6\u4e0a\uff0c\u57fa\u4e8e React \u7684\uff0c\u6216\u8005\u8bf4\u4e3a React \u6240\u670d\u52a1\u7684\u6846\u67b6\u4e2d\uff0cnext \u7684\u70ed\u5ea6\u5728\u6301\u7eed\u4e0a\u6da8\u3002

"},{"location":"docs/2023/04/18/#6-source-map","title":"6.\u4ec0\u4e48\u662f source map","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://developer.chrome.com/en/blog/devtools-tips-23

\u6765\u81ea Google Chrome \u7684\u4f5c\u8005\u7684\u5206\u4eab\u3002

\u987a\u5e26\u5206\u4eab\u4ee5\u4e0b source map \u548c source code \u7684\u6620\u5c04\u5de5\u5177.

\u76f8\u5173\u5730\u5740\uff1ahttps://sokra.github.io/source-map-visualization/

"},{"location":"docs/2023/04/18/#7jspm","title":"7.JSPM \u91cd\u65b0\u542f\u52a8","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://jspm.org/jspm-cli

\u5728\u4e0a\u4e00\u5468\u7684\u5468\u520a\u4e2d\uff0c\u6211\u6709\u4ecb\u7ecd\u5230\uff1aJavaScript Import Maps \u652f\u6301\u8de8\u6d4f\u89c8\u5668

\u6240\u4ee5\u5728\u51e0\u5e74\u524d\u8352\u5e9f\u7684 jspm \u9879\u76ee\u5f97\u4ee5\u91cd\u542f\u3002

"},{"location":"docs/2023/04/18/#8chrome-extension-cli","title":"8.chrome-extension-cli","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/dutiyesh/chrome-extension-cli

\u4e0b\u4e00\u4ee3\u6d4f\u89c8\u5668\u6269\u5c55\u5f00\u53d1\u5de5\u5177\u7684\u811a\u624b\u67b6\u9879\u76ee\uff0c\u770b\u8d77\u6765\u4e0d\u9519\uff0c\u5929\u7136\u652f\u6301\u4e86 webpack \uff0c\u5e76\u4e14\u4f5c\u4e3a\u9884\u8bbe\u3002

"},{"location":"docs/2023/04/18/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/04/19/","title":"Scholar's Weekly \u7b2c19\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/04/19/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a npm\u3001React\u3001ES2023\u3001Node\u3001Vite\u3001Enum

"},{"location":"docs/2023/04/19/#1npm-package-provenance","title":"1.npm-package-provenance","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.blog/2023-04-19-introducing-npm-package-provenance

npm \u652f\u6301\u4e86 provenance\uff0c\u7528\u6765\u7ed9\u67d0\u4e00\u4e2a\u5305\u6253\u4e00\u4e2a\u6807\u8bc6\uff0c\u7528\u6765\u8868\u660e\u8fd9\u4e2a\u5305\u901a\u8fc7\u4e86 CI/CD \u7684\uff0c\u7528\u4e8e\u63d0\u5347\u5305\u7684\u5b89\u5168\u6027\u80fd\u3002

"},{"location":"docs/2023/04/19/#2introduction-to-react","title":"2.introduction to React","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://react.gg/visualized

\u6bd4\u8f83\u751f\u52a8\u5f62\u8c61\u5730\u4ecb\u7ecd React \u6240\u7ecf\u5386\u7684\u5f62\u6001\uff1aMV -> MVC -> MVVM\u3002

\u4ee5\u52a8\u753b\u5f62\u5f0f\u4ecb\u7ecd\uff0c\u72b6\u6001\u548c UI \u4e4b\u95f4\u6d41\u8f6c\u3002

"},{"location":"docs/2023/04/19/#3es2023","title":"3.ES2023","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://pawelgrzybek.com/whats-new-in-ecmascript-2023/

\u4ecb\u7ecd\u4e0b\u51e0\u4e2a\u7279\u6027\uff1a

  • Array.prototype \u4e0a\u65b0\u589e findLast & findLastIndex

    const isEven = (number) => number % 2 === 0;\nconst numbers = [1, 2, 3, 4];\n\n// from first to the last lookup\nconsole.log(numbers.find(isEven));\n// 2\nconsole.log(numbers.findIndex(isEven));\n// 1\n\n// from last to the first lookup\nconsole.log(numbers.findLast(isEven));\n// 4\nconsole.log(numbers.findLastIndex(isEven));\n// 3\n

  • \u7f16\u5199\u547d\u4ee4\u884c CLI \u7684\u5934\u6587\u4ef6\u4e66\u5199\u5f00\u59cb\u89c4\u8303\u5316

    #!/usr/bin/env node\n\nconsole.log('hi \ud83d\udc4b');\n

  • WeakMap \u652f\u6301 Symbol \u4f5c\u4e3a\u5b83\u7684 key

  • Array \u652f\u6301\u4e86\u51e0\u4e2a\u6709\u7528\u7684\u4e0d\u4fee\u6539\u539f\u6570\u7ec4\u7684\u65b9\u6cd5
  • toReversed \u5bf9\u6807 reverse
  • toSorted \u5bf9\u6807 sort
  • toSplice \u5bf9\u6807 splice
"},{"location":"docs/2023/04/19/#4node-v20-released","title":"4.Node V20 Released","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://nodejs.org/en/blog/announcements/v20-release-announce

Node \u53d1\u5e03\u4e86 V20 \u7248\u672c\uff1a - \u4e00\u4e2a\u5b9e\u9a8c\u6027\u7684\u6743\u9650\u6a21\u578b\u3002\u8fd9\u662f Deno \u6838\u5fc3\u7684\u4e00\u4e2a\u529f\u80fd\uff0c\u4f46\u73b0\u5728\u4f60\u4e5f\u53ef\u4ee5\u9650\u5236 Node \u4e2d\u67d0\u4e9b\u80fd\u529b\u7684\u8bbf\u95ee\u3002 - V8 11.3\uff08\u5305\u62ec\u6b63\u5219\u8868\u8fbe\u5f0f /v \u6807\u5fd7\u652f\u6301\uff09 - node:test \u6d4b\u8bd5\u8fd0\u884c\u5668\u7a33\u5b9a\u4e86\u3002 - ARM64 \u4e0a\u7684 Windows \u5b98\u65b9\u652f\u6301\u3002 - \u5355\u4e2a\u53ef\u6267\u884c\u6587\u4ef6\u6253\u5305\u673a\u5236\u7684\u6539\u8fdb\u3002

"},{"location":"docs/2023/04/19/#5vite-so-faaaaster","title":"5.Vite so faaaaster","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://sun0day.github.io/blog/vite/why-vite4_3-is-faster.html

Vite \u53d1\u5e03\u4e86 4.3 \u7248\u672c\uff0c\u53f7\u79f0 faaaaaster\uff0c\u8fd9\u7bc7\u6587\u7ae0\u96c6\u4e2d\u4ecb\u7ecd\u4e86\u4e3a\u4e86\u5feb\uff0cVite \u56e2\u961f\u505a\u4e86\u4ec0\u4e48\u4e8b\u60c5\u3002

"},{"location":"docs/2023/04/19/#6-javascript-enum","title":"6.\u5728 JavaScript \u4e2d\u521b\u5efa enum \u7684\u56db\u79cd\u5f62\u5f0f","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://dmitripavlutin.com/javascript-enum/

"},{"location":"docs/2023/04/19/#7ohash","title":"7.Ohash","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/unjs/ohash

\u8d85\u7ea7\u5feb\u7684 hash \u5e93\uff0c\u6211\u60f3\u7528\u4f5c\u5927\u5bf9\u8c61 hash \u540e\u505a diff \u4e00\u5b9a\u5f88\u5feb\u3002

"},{"location":"docs/2023/04/19/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/05/20/","title":"Scholar's Weekly \u7b2c20\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/05/20/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a npm\u3001React\u3001const\u3001CSS\u3001FUSE

"},{"location":"docs/2023/05/20/#1","title":"1.\u4e0d\u963b\u585e\u4e8b\u4ef6\u5faa\u73af\u7684\u5b9e\u7528\u6307\u5357","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.bbss.dev/posts/eventloop/

\u4e0d\u963b\u585e\u4e8b\u4ef6\u5faa\u73af\u7684\u5b9e\u7528\u6027\u6307\u5bfc\uff0c\u6587\u7ae0\u5217\u4e3e\u4e86\u4e00\u4e9b\u5217\u4e0d\u963b\u585e\u4e8b\u4ef6\u5faa\u73af\u7684\u6848\u4f8b\u3002

"},{"location":"docs/2023/05/20/#2react","title":"2.React \u6e32\u67d3\u4ea4\u4e92\u6307\u5357","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://ui.dev/why-react-renders

COMPONENTVIEWSNAPSHOT"},{"location":"docs/2023/05/20/#3","title":"3.\"\u5e38\u91cf\"\u9677\u8fdb","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.joshwcomeau.com/javascript/the-const-deception/

\u6587\u7ae0\u6838\u5fc3\u4ecb\u7ecd\u4e86 const \u4fee\u9970\u503c\u7c7b\u578b\u548c\u5f15\u7528\u7c7b\u578b\u7684\u5dee\u5f02\u3002

"},{"location":"docs/2023/05/20/#4-javascript-css","title":"4.\u901a\u8fc7\u501f\u9274 JavaScript \u51fd\u6570\u7684\u601d\u60f3\u6765\u7f16\u5199\u66f4\u597d\u7684 CSS","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.smashingmagazine.com/2023/04/write-better-css-borrow-ideas-javascript-functions/

"},{"location":"docs/2023/05/20/#5-npm","title":"5.\u5256\u6790 Npm \u6076\u610f\u8f6f\u4ef6\uff1a\u4e94\u4e2a\u8f6f\u4ef6\u5305\u53ca\u5176\u90aa\u6076\u7684\u5b89\u88c5\u811a\u672c","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.sandworm.dev/dissecting-npm-malware-five-packages-and-their-evil-install-scripts

\u53ef\u4ee5\u5148\u770b\u4e00\u4e0b npm \u5305\u7684\u6700\u4f73\u5b9e\u8df5\u3002

"},{"location":"docs/2023/05/20/#6-fusejs","title":"6.\u4f7f\u7528 Fuse.js \u8fdb\u884c\u5feb\u901f\u7b80\u5355\u7684\u6a21\u7cca\u641c\u7d22","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://spin.atomicobject.com/2023/04/27/fuse-js-fuzzy-search/

\u5927\u4f53\u91cf\u7684\u7eaf\u524d\u7aef\u6a21\u7cca\u641c\u7d22\u53ef\u4ee5\u7528\u8d77\u6765\u3002

"},{"location":"docs/2023/05/20/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/05/21/","title":"Scholar's Weekly \u7b2c21\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/05/21/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a React\u3001RegExp\u3001Performance\u3001ESLint\u3001Knip

"},{"location":"docs/2023/05/21/#1react-canaries-enabling-incremental-feature-rollout-outside-meta","title":"1.React Canaries: Enabling Incremental Feature Rollout Outside Meta","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://react.dev/blog/2023/05/03/react-canaries

React \u56e2\u961f\u63a8\u51fa\u4e86\u91d1\u4e1d\u96c0\u7248\u672c\uff0c\u65e8\u5728\u4e3a\u60f3\u66f4\u5feb\u4f53\u9a8c\u65b0\u529f\u80fd\u7684\u7528\u6237\u591a\u4e00\u79cd\u9009\u62e9\uff0c\u8fd9\u4e9b\u91d1\u4e1d\u96c0\u7248\u672c\u7684\u529f\u80fd\u6700\u7ec8\u90fd\u4f1a\u88ab\u5408\u5e76\u8fdb\u7a33\u5b9a\u7248\u672c\u3002

"},{"location":"docs/2023/05/21/#2javascript","title":"2.JavaScript \u6b63\u5219\u8868\u8fbe\u5f0f","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.honeybadger.io/blog/javascript-regular-expressions/

JavaScript \u6b63\u5219\u8868\u8fbe\u5f0f\u5165\u95e8\u3002

"},{"location":"docs/2023/05/21/#3how-to-measure-page-loading-time-with-performance-api","title":"3.How to measure page loading time with Performance API","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.silvestar.codes/articles/how-to-measure-page-loading-time-with-performance-api/

"},{"location":"docs/2023/05/21/#4configuring-eslint-prettier-and-typescript-together","title":"4.Configuring ESLint, Prettier, and TypeScript Together","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.joshuakgoldberg.com/configuring-eslint-prettier-and-typescript-together/

\u6587\u7ae0\u4e3b\u8981\u8bb2\u8ff0\u5728 React \u4e2d\u5982\u4f55\u540c\u65f6\u914d\u7f6e eslint\u3001prettier \u548c typescript\u3002

"},{"location":"docs/2023/05/21/#5knip","title":"5.Knip","text":"

\u76f8\u5173\u5730\u5740\uff1bhttps://github.com/webpro/knip

\u4e00\u4e2a\u65b0\u7684\u627e\u5230\u9879\u76ee\u4e2d\u672a\u4f7f\u7528\u7684\u4f9d\u8d56\u7684\u5de5\u5177\uff0c\u540c\u7b49\u5de5\u5177\u8fd8\u6709\uff1anpm-check\u3001depcheck......

"},{"location":"docs/2023/05/21/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/05/22/","title":"Scholar's Weekly \u7b2c22\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/05/22/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a Bun\u3001Deopt Explorer\u3001Promise.withResolvers\u3001Unit Test\u3001Jest

"},{"location":"docs/2023/05/22/#1bun-new-bundler","title":"1.Bun new bundler","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://bun.sh/blog/bun-bundler

Bun \u6709\u4e86\u4e00\u4e2a\u539f\u751f\u7684\u6253\u5305\u5de5\u5177\uff0c\u7ecf\u8fc7\u57fa\u51c6\u6d4b\u8bd5\u540e\u7684\u901f\u5ea6\uff0cUnbelievable\uff0cso cool...\u3002

\u6b64\u5916\u8fd8\u6709\u4e00\u4e2a\u66f4\u9177\u7684\u5185\u5bb9\uff1a

"},{"location":"docs/2023/05/22/#2using-bunjs-as-a-bundler","title":"2.Using Bun.js as a bundler","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://shaneosullivan.wordpress.com/2023/05/17/using-bun-js-as-a-bundler

\u521a\u597d\u4f5c\u4e3a\u627f\u63a5\u7b2c\u4e00\u6761\u5468\u520a\u7684\u5185\u5bb9\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u4f7f\u7528\u8005\u7684\u611f\u53d7\uff0cShane O'Sullivan \u6709\u4e86\u81ea\u5df1\u7684\u5fc3\u5f97\u4f53\u4f1a\uff0c\u5305\u62ec\u5bf9\u4e8e vercel \u4e0a\u6784\u5efa\u5185\u5bb9\u7684\u4e00\u4e9b\u5751\u70b9\u3002

em\uff0c\u6559\u79d1\u4e66\u5f0f\u6307\u5bfc\u3002

"},{"location":"docs/2023/05/22/#3deopt-explorer","title":"3.Deopt Explorer \u7b80\u4ecb","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://devblogs.microsoft.com/typescript/introducing-deopt-explorer/

Deopt Explorer \u7684\u5de5\u5177\u6765\u5e2e\u52a9\u6211\u4eec\u63a2\u7d22 V8 \u5728\u7f16\u8bd1\u5668\u6267\u884c\u65f6\u4ea7\u751f\u7684\u5404\u79cd\u53cd\u4f18\u5316\u3001IC \u548c\u5bf9\u8c61\u7c7b\u578b\u3002

\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u63d2\u4ef6\u53ef\u4ee5\u67e5\u770b\u51fd\u6570\u7684\u72b6\u6001\u4fe1\u606f\u3002

"},{"location":"docs/2023/05/22/#4promisewithresolvers","title":"4.Promise.withResolvers","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/tc39/proposal-promise-with-resolvers

\u901a\u5e38\u5927\u5bb6\u662f\u5982\u4f55\u5904\u7406\u9876\u5c42\u7684 new Promise \u7684 rej \u548c resolve \u51fd\u6570\u7684\u5462\uff1f

const handler = (callback) => new Promise(\n(res, rej) => {\ncallback(res, rej);\n}\n);\n\nhandler((res, rej) => {\nif(true) {\nres(); // do right something\n} else {\nrej(); // do reject\n}\n})\n

\u73b0\u5728\u6709\u4e86 Promise.withResolvers \u53ef\u4ee5\u5f88\u597d\u7684\u7f13\u89e3\u8fd9\u4e2a\u72b6\u6001\uff0c\u5b83\u6709\u70b9\u50cf\u662f React Context\uff0c\u6309\u7167\u89c4\u8303\u7279\u6027\u7684\u63cf\u8ff0\uff1a

On subclasses of Promise, the withResolvers method should produce instances of the subclass.

\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u6539\u9020\u4e0b\uff0c\u50cf\u662f\u4e0b\u9762\u8fd9\u79cd\uff1a

const handler = (callback) => new Promise(\n(res, rej) => {\ncallback();\n}\n);\n\nhandler(() => {\nconst { reject, resolve, promise } = Promise.withResolvers();\n\nif(true) {\nresolve(); // do right something\n} else {\nreject(); // do reject\n}\n});\n

so cool!\u3002

"},{"location":"docs/2023/05/22/#5-javascript","title":"5.\u4f7f\u7528\u7eaf JavaScript \u83b7\u5f97\u5b8c\u6574\u7684\u7c7b\u578b\u652f\u6301","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.pausly.app/blog/full-type-support-with-plain-javascript

\u5728\u67d0\u79cd\u7279\u5b9a\u573a\u666f\u4e0b\uff0c\u4f60\u4e0d\u5fc5\u4fee\u6539 *.js \u4e3a *.ts \u83b7\u53d6\u7c7b\u578b\u652f\u6301\uff0c\u5b8c\u5168\u53ef\u4ee5\u501f\u52a9 JSDOC \u83b7\u53d6\u652f\u6301\u3002

"},{"location":"docs/2023/05/22/#6-jest","title":"6.\u4f60\u7684 Jest \u6d4b\u8bd5\u53ef\u80fd\u662f\u9519\u8bef\u7684","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://jamiemagee.co.uk/blog/your-jest-tests-might-be-wrong/

\u4f60\u7684 Jest \u5957\u4ef6\u914d\u7f6e\u53ef\u80fd\u6709\u4e9b\u95ee\u9898\uff0cMagee \u5411\u6211\u4eec\u5c55\u793a\u4e00\u7ec4\u6bd4\u8f83\u597d\u7684\u9ed8\u8ba4\u914d\u7f6e\uff0c\u56e0\u4e3a\u4e00\u4e9b\u6d4b\u8bd5\u72b6\u6001\u53ef\u80fd\u4f1a\u53d1\u751f\u6cc4\u6f0f\uff0c\u5bfc\u81f4\u6211\u4eec\u7684\u6d4b\u8bd5\u7528\u4f8b\u7ed3\u679c\u53ef\u80fd\u662f\u9519\u8bef\u7684\uff1a - \u6b63\u786e\u7684\u7528\u4f8b\u5b9e\u9645\u56e0\u4e3a\u72b6\u6001\u672a\u91cd\u7f6e\u5bfc\u81f4\u9519\u8bef\uff0c\u8ba9\u4eba\u4ea7\u751f\u56f0\u60d1\uff1b - \u9519\u8bef\u7684\u7528\u4f8b\u56e0\u4e3a\u72b6\u6001\u672a\u91cd\u7f6e\u5bfc\u81f4\u6b63\u786e\uff0c\u8ba9\u7a0b\u5e8f\u4ea7\u751f\u201c\u6b3a\u9a97\u201d\uff1b

{\nclearMocks: true,\nresetMocks: true,\nrestoreMocks: true,\nresetModules: true // It depends\n}\n
"},{"location":"docs/2023/05/22/#7legend-state","title":"7.Legend-State","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://legendapp.com/open-source/legend-state-v1/

\u5728\u901f\u5ea6\u548c\u5185\u5b58\u4e0a\u53d6\u5f97\u91cc\u538b\u5236\u6027\u80dc\u5229\u7684\u4e00\u4e2a\u65b0\u7684 React State \u5e93\uff0c\u53ef\u4ee5\u770b\u4e0b\u7b80\u5355\u7684\u57fa\u51c6\u6d4b\u8bd5\uff1a

"},{"location":"docs/2023/05/22/#8headless-qr","title":"8.headless-qr","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/Rich-Harris/headless-qr

\u4e00\u4e2a\u73b0\u4ee3\u5316\u7684 QR \u751f\u6210\u5de5\u5177\u3002

"},{"location":"docs/2023/05/22/#9eslint-plugin-check-file","title":"9.eslint-plugin-check-file","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/DukeLuo/eslint-plugin-check-file

\u6211\u731c\u4f60\u80af\u5b9a\u542c\u8fc7 \u5f15\u5165\u5305\u6392\u5e8f(simple-import-sort)\u3001\u5305\u7ba1\u7406(eslint-plugin-package-json-dependencies)\u7b49\u63d2\u4ef6\u3002

\u68c0\u6d4b\u6587\u4ef6\u540d\uff0c\u652f\u6301\u5b8c\u5168\u53d7\u63a7\u7684\u6587\u4ef6\u540d\uff0c\u4fdd\u6301\u9879\u76ee\u6587\u4ef6\u540d\u683c\u5f0f\u7684\u4e00\u81f4\u6027\u662f\u4e00\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002

\u5468\u520a\u4e2d\u8bf4\u4e86\u592a\u591a\u6b21 so cool\uff0c\u662f\u56e0\u4e3a\u6211\u6700\u8fd1\u5728\u770b\u300a\u95ea\u7535\u4fa0\u300b\uff0c\u201c\u5df4\u91cc\u201d\uff08\u4f5c\u4e3a\u4e3b\u4eba\u516c\uff09\u5f88\u559c\u6b22\u8bf4\u7684\u4e00\u4e2a\u8bcd\uff0cwaw! so cool~~~

"},{"location":"docs/2023/05/22/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/05/23/","title":"Scholar's Weekly \u7b2c23\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/05/23/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a Array\u3001Is-Lint\u3001webcomponent\u3001dynaboard\u3001DeviceScript

"},{"location":"docs/2023/05/23/#1forofflatmapreduce","title":"1.for...of\u3001flatMap\u3001reduce \u7684\u5b9e\u7528\u6027\u6307\u5bfc","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://2ality.com/2022/05/processing-arrays-non-destructively.html

\u65b9\u6cd5 \u540c\u6b65 \u5f02\u6b65\u65b9\u6848 \u6539\u53d8\u539f\u6570\u7ec4 \u63d0\u524d\u9000\u51fa for...of \u2705 \u2705 \u274c \u2705 flatMap \u2705 \u274c \u274c \u274c reduce \u2705 \u274c \u274c \u274c"},{"location":"docs/2023/05/23/#2-is-lint","title":"2. Is-Lint","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/loeffel-io/ls-lint

\u6587\u4ef6\u6216\u8005\u6587\u4ef6\u540d\u7684 Lint \u5de5\u5177\uff0c\u6700\u597d\u7684\u4f18\u52bf\u201c\u5feb\u901f\u201d\u3002

"},{"location":"docs/2023/05/23/#3-webcomponent","title":"3. webcomponent \u7684\u5b9e\u8df5\u5b9e\u4f8b","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.rasvi.io/2023-05-21-webcomponent-intro-with-example

\u5177\u6709\u5b9e\u7528\u6027\u6307\u5bfc\u7684 webComponent \u5b9e\u8df5\u3002

"},{"location":"docs/2023/05/23/#4dynaboard","title":"4.dynaboard","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://dynaboard.com/

dynaboard \u514d\u8d39\u7684 dashboard \u7684\u5de5\u5177\uff0c\u4e13\u4e3a\u5f00\u53d1\u4eba\u5458\u51c6\u5907\u3002

"},{"location":"docs/2023/05/23/#5devicescript","title":"5.DeviceScript","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://microsoft.github.io/devicescript/

DeviceScript \u4f7f\u7528 TypeScript \u8fdb\u884c\u7269\u8054\u7f51\u8bbe\u5907\uff0c\u65b0\u9896\u4e14\u5b9e\u7528\u3002

"},{"location":"docs/2023/05/23/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/06/24/","title":"Scholar's Weekly \u7b2c24\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/06/24/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a URL\u3001aimless\u3001sharedWorker\u3001React\u3001quic

"},{"location":"docs/2023/06/24/#1-javascript-url","title":"1.\u5b89\u5168\u7684 JavaScript URL \u9a8c\u8bc1","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://snyk.io/blog/secure-javascript-url-validation/?utm_campaign=aom_2023&utm_medium=paid-email&utm_source=cooperpress-javascript-weekly&utm_content=secure-javascript-url-validation

\u5f53\u6211\u4eec\u5728\u4e66\u5199 JavaScript \u65f6\uff0c\u5927\u90e8\u5206\u573a\u666f\u4e0b\u5bf9\u4e8e URL \u7684\u7ed3\u6784\u68c0\u9a8c\uff0c\u5355\u7eaf\u7684\u53ea\u662f\u9760\u7b80\u5355\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u5904\u7406\uff0c\u4f46\u662f\u5197\u957f\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u65e2\u5f62\u6210\u4e86\u5bb9\u6613\u51fa\u9519\u7684\u7aef\u502a\uff0c\u4e5f\u5bb9\u6613\u51fa\u73b0\u6267\u884c\u7f13\u6162\u7684\u60c5\u51b5\uff08\u5982\u679c\u4f60\u5bf9\u6b64\u62b1\u6709\u8d28\u7591\uff0c\u8bf7\u8be6\u7ec6\u4e86\u89e3\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u6027\u80fd\u95ee\u9898\uff09\u3002

function checkHttpUrl(string) {\nlet givenURL;\ntry {\ngivenURL = new URL(string);\n} catch (error) {\nconsole.log(\"error is\",error)\nreturn false;  }\nreturn givenURL.protocol === \"http:\" || givenURL.protocol === \"https:\";\n}\n

\u8fd9\u91cc\u5176\u5b9e\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\u3002

"},{"location":"docs/2023/06/24/#2aimlessjs","title":"2.aimless.js","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/ChrisCavs/aimless.js#using-custom-prng

\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u6709\u201c\u751f\u6210\u968f\u673a\u6570\u7684\u9700\u6c42\u201d\uff0c\u53ef\u80fd\u662f\u7b80\u5355\u7684\u5199\u4e00\u4e2a\u51fd\u6570\uff0c\u4f46\u662f\u6bcf\u6b21\u90fd\u53bb\u5199\uff0c\u96be\u514d\u7e41\u7410\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528 aimless \u89e3\u51b3\u4e00\u4e9b\u968f\u673a\u6570\u7684\u751f\u6210\u95ee\u9898\uff1a

const intSeq = intSequence(-1, 3)\n// could return [3,-1,2,1,0], [0,2,-1,3,1], etc\n

\u4ee5\u4e0a\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4e3e\u4f8b\uff0c\u968f\u673a\u751f\u6210\u8303\u56f4\u7684\u6570\u5b57\u5e8f\u5217\u3002

"},{"location":"docs/2023/06/24/#3-websocket","title":"3.\u5728\u6d4f\u89c8\u5668\u9009\u9879\u5361\u4e4b\u95f4\u5171\u4eab websocket \u94fe\u63a5","text":"

\u76f8\u5173\u5730\u5740\uff1bhttps://brightinventions.pl/blog/sharing-websocket-connections-between-browser-tabs-and-windows

\u6309\u7167\u4ee5\u5f80\u7684\u4e1a\u52a1\u5f00\u53d1\u65b9\u5f0f\uff0c\u6211\u4eec\u7ecf\u5e38\u4f1a\u8fd9\u4e48\u5904\u7406 websocket \uff0c\u4e00\u4e2a tab \u4e00\u4e2a\u94fe\u63a5\uff0c\u90a3\u4e48\u5c31\u4f1a\u5bfc\u81f4 ws \u5c42\u7684\u4e1a\u52a1\u538b\u529b\uff0c\u8fc7\u591a\u7684 \u8fde\u63a5\u6570\u3002

\u8fd9\u91cc\u4ecb\u7ecd\u4e86\u4e00\u79cd\u89e3\u51b3\u65b9\u6848\uff1a SharedWorker ,\u7528\u4e8e\u7a97\u53e3\u95f4\u7684\u5171\u4eab\uff0c\u5c06\u6d88\u606f\u7684\u4f20\u9012\uff0c\u6539\u4e3a\u8fdb\u7a0b\u4e2d\u4f20\u8f93\u3002

"},{"location":"docs/2023/06/24/#4react","title":"4.React \u662f\u600e\u4e48\u5de5\u4f5c\u7684\uff1f","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.youtube.com/watch?v=za2FZ8QCE18

\u89c6\u9891\u5728\u6cb9\u7ba1\u4e0a\uff0c\u5728\u4f60\u70b9\u51fb\u89c2\u770b\u524d\uff0c\u53ef\u4ee5\u5148\u601d\u8003\u4ee5\u4e0b\u51e0\u4e2a\u95ee\u9898\uff0c\u5982\u679c\u4f60\u5f88\u6e05\u695a\uff0c\u90a3\u4e48\u53ef\u4ee5\u8df3\u8fc7\uff0c\u56e0\u4e3a\u89c6\u9891\u5e76\u6ca1\u6709\u6df1\u5165\u8bb2\u89e3\u592a\u591a\u7684\u5185\u5bb9\uff1a

  • \u4e3a\u4ec0\u4e48 React \u4e0d\u8ba4\u8bc6 jsx\uff1f
  • \u4e24\u9897\u6811\u76f4\u63a5\u662f\u5982\u679c diff \u7684\uff1f
"},{"location":"docs/2023/06/24/#5","title":"5.\u56fe\u89e3\u5404\u79cd\u534f\u8bae\u7684\u6d41\u8f6c\u8fc7\u7a0b","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://cangsdarm.github.io/illustrate/tls13

"},{"location":"docs/2023/06/24/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/06/25/","title":"Scholar's Weekly \u7b2c25\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/06/25/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a wasm\u3001Typescript\u3001RSC\u3001JS\u3001bundle.js

"},{"location":"docs/2023/06/25/#1-wasm-polyfill","title":"1.\u4e00\u4e2a\u5728\u6d4f\u89c8\u5668\u7aef\u7684 wasm polyfill","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/evanw/polywasm

\u5927\u81f4\u80cc\u666f\uff1a - Apple \u7684\u9501\u5b9a\u6a21\u5f0f\u4f1a\u5728 safari \u4e2d\u7981\u7528 WebAssembly\uff0cpolyfill \u4f7f\u5f97\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u8ba9\u8fd0\u884c\u6210\u4e3a\u53ef\u80fd\u3002 - \u4f5c\u8005\u8ba4\u4e3a\u4ed6\u4ece\u4e2d\u5b66\u5230\u4e86\u5f88\u591a\u65b0\u7684\u4e1c\u897f\u3002

"},{"location":"docs/2023/06/25/#2typescript-51","title":"2.TypeScript 5.1 \u53d1\u5e03","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://devblogs.microsoft.com/typescript/announcing-typescript-5-1/

\u529f\u80fd\u70b9\uff1a

  • undefined \u8fd4\u56de\u51fd\u6570\u7684\u9690\u5f0f\u8fd4\u56de\u66f4\u5bb9\u6613
  • getter \u548c setter \u7684\u4e0d\u76f8\u5173\u7c7b\u578b
  • JSX \u5143\u7d20\u548c JSX \u6807\u7b7e\u7c7b\u578b\u4e4b\u95f4\u7684\u89e3\u8026\u7c7b\u578b\u68c0\u67e5
  • \u547d\u540d\u7a7a\u95f4 JSX \u5c5e\u6027
  • typeRoots \u5728\u6a21\u5757\u89e3\u6790\u4e2d\u88ab\u54a8\u8be2
  • JSX \u6807\u7b7e\u7684\u94fe\u63a5\u6e38\u6807
  • @paramJSDoc \u6807\u7b7e\u7684\u4ee3\u7801\u6bb5\u8865\u5168
  • \u4f18\u5316
  • \u91cd\u5927\u53d8\u5316

\u5176\u4e2d\u6211\u89c9\u5f97\u91cd\u5927\u53d8\u5316\u662f\u5927\u5bb6\u9700\u8981\u5173\u6ce8\u7684\u70b9\uff0c\u5c31\u662f TypeScript 5.1 \u9ed8\u8ba4\u8981\u6c42 Node \u7248\u672c\u5fc5\u987b\u5728 14.17 \u4ee5\u4e0a\u4e86\u3002

"},{"location":"docs/2023/06/25/#3rsc","title":"3.RSC \u4ece\u96f6\u5f00\u59cb","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/reactwg/server-components/discussions/5

Dan \u5199\u4e86\u4e00\u4e2a\u4ece\u96f6\u5f00\u59cb \u670d\u52a1\u7aef\u7ec4\u4ef6 \u7684\u6559\u7a0b\uff0c\u65e8\u5728\u4e3a\u54ea\u4e9b\u60f3\u7814\u7a76\u670d\u52a1\u5668\u7ec4\u4ef6\u80cc\u540e\u601d\u60f3\u7684\u4eba\u6765\u4e00\u6b21\u6df1\u5ea6\u601d\u8003\u548c\u5b66\u4e60\u3002

"},{"location":"docs/2023/06/25/#4the-many-ways-to-select-the-n-th-character-from-a-string","title":"4.The many ways to select the n-th character from a string.","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://christianheilmann.com/2023/06/02/the-many-ways-to-select-the-n-th-character-from-a-string/

\u9009\u62e9\u4e00\u4e2a\u5b57\u7b26\u4e32\u4e2d\u7684\u7b2c n \u4e2a\u5b57\u7b26\u7684\u8bb8\u591a\u79cd\u65b9\u6cd5\uff1a

"},{"location":"docs/2023/06/25/#5eslint-plugin-perfectionist","title":"5.ESLint Plugin Perfectionist","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/azat-io/eslint-plugin-perfectionist

\u6392\u5e8f\u4e00\u4e9b\u5e38\u89c1\u7684\u5185\u5bb9\uff1asorting various data, such as objects, imports, TypeScript types, enums, JSX props, etc.

\u52a8\u673a\uff1a\u7f8e\u5b66\u3001\u53ef\u7ef4\u62a4\u6027\u3001\u4e00\u81f4\u6027\u3001\u53ef\u8bfb\u6027

"},{"location":"docs/2023/06/25/#6bundlejs","title":"6.bundle.js","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.okikio.dev/documenting-an-online-bundler-bundlejs

\u57fa\u4e8e Esbuild \u7684\u5728\u7ebf\u6253\u5305\u5668\uff0c\u652f\u6301\u5728\u7ebf\u8f93\u51fa\u6253\u5305\u5206\u6790\u3002

\u5b98\u65b9\u7ed9\u51fa\u7684\u80fd\u529b\u6216\u8005\u597d\u5904\u6709\u4e0b\u9762\u8fd9\u4e9b\uff1a

  • \u66f4\u5bb9\u6613\u8c03\u8bd5\u9519\u8bef
  • \u53ef\u4ee5\u9a8c\u8bc1\u751f\u6210\u7684\u6346\u7ed1\u4ee3\u7801
  • \u914d\u7f6e\u6346\u7ed1\u5305\u7684\u80fd\u529b
  • tree shaking \u6346\u7ed1\u5305\u7684\u80fd\u529b
  • \u80fd\u591f\u67e5\u770b\u6346\u7ed1\u5305\u7684\u53ef\u89c6\u5316\u5206\u6790
  • \u652f\u6301\u6765\u81ea\u4e0d\u540c\u5185\u5bb9\u4ea4\u4ed8\u7f51\u7edc (CDN)\u7684\u4e0d\u540c\u7c7b\u578b\u7684\u6a21\u5757\uff0c\u4f8b\u5982\u4ece deno \u6a21\u5757\u5230 npm \u6a21\u5757\u5230\u968f\u673a github \u811a\u672c\u7b49\u7684 CDN...
"},{"location":"docs/2023/06/25/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/06/26/","title":"Scholar's Weekly \u7b2c26\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/06/26/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a gists\u3001chrome for testing\u3001npm\u3001TypeScript

"},{"location":"docs/2023/06/26/#1github-gists-aws-lambda","title":"1.github gists \u8dd1\u5728 aws lambda\uff0c\u90a3\u4e00\u5b9a\u5f88\u6709\u8da3","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.val.town/

serverless \u60f3\u6765\u5927\u5bb6\u4e00\u5b9a\u5e76\u4e0d\u964c\u751f\uff0c\uff08\u7b80\u5355\u5b9a\u4e49\uff1a\u7ed9\u5b9a\u51fd\u6570\u5728\u4e91\u4e0a\u8dd1\uff0c\u7ed9\u4e00\u4e2a\u8f93\u5165\uff0c\u5410\u4e00\u4e2a\u8f93\u51fa\u51fa\u6765\uff09\uff0c\u4f5c\u8005\u5728\u6587\u4e2d\u60f3\u9610\u8ff0\u7684\u610f\u601d\u4e5f\u662f\u8fd9\u4e2a\u3002

\u804a\u5230 serverless \uff0c\u5176\u5b9e\u7a81\u7136\u60f3\u5230\u4e86 ssr\uff0cssr\uff0c\u5b87\u6602\u5927\u4f6c\u5199\u7684\uff0c\u53f7\u79f0\u5730\u8868\u6700\u5f3a ssr \u6846\u67b6\uff0c\u63d0\u4f9b\u4e86 serverless \u80fd\u529b\uff0c\u5982\u679c\u4f60\u8fd8\u4e0d\u6e05\u695a\u4ec0\u4e48\u662f serverless\uff0c\u6211\u63a8\u8350\u9605\u8bfb \u8ddf\u72fc\u53d4\u804a\u4e86\u4e00\u591c\uff0c\u7ec8\u4e8e\u641e\u660e\u767d\u4e86 Serverless \u662f\u4ec0\u4e48\uff1f

"},{"location":"docs/2023/06/26/#2chrome-for-testing","title":"2.chrome-for-testing","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://developer.chrome.com/blog/chrome-for-testing

\u5927\u81f4\u5185\u5bb9\uff1achrome \u53d1\u5e03\u4e86\u4e00\u4e2a\u53ef\u4ee5\u4e13\u95e8\u7528\u6765\u6d4b\u8bd5\u7684\u6d4f\u89c8\u5668\u7248\u672c\uff0cchrome test\u3002

\u5927\u767d\u8bdd\u6765\u8bf4\uff0c10 \u5e74\u540e\uff0c\u4f60\u4ecd\u65e7\u53ef\u4ee5\u83b7\u5f97\u73b0\u5728\u7684 chrome \u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u8fd9\u4e2a\u4fe1\u606f\u610f\u5473\u7740\u672a\u6765\u4f4e\u7248\u672c\u6d4f\u89c8\u5668\u7684\u6d4b\u8bd5\u53ef\u884c\u6027\u6781\u5927\u7684\u5728\u63d0\u9ad8\u3002

\u6839\u636e MDN 2021\u5e74 \u62a5\u544a\uff0c\u8de8\u6d4f\u89c8\u5668\u7248\u672c\u6d4b\u8bd5\u662f\u5f00\u53d1\u8005\u5934\u75bc\u7684\u4e00\u4e2a\u70b9\u3002

\u597d\u4e86\uff0c\u8bf4\u5b8c\u4e86\u597d\u6d88\u606f\uff0c\u90a3\u6211\u4eec\u63a5\u4e0b\u6765\u4f20\u9012\u4e00\u4e2a\u574f\u6d88\u606f\uff1a

\u66f4\u4f4e\u7248\u672c\u7684\u6d4f\u89c8\u5668\u662f\u4e0d\u652f\u6301\u7684\uff0c\u4e5f\u5c31\u662f chrome 113 \u4e4b\u524d\u7684\u7248\u672c\u57fa\u672c\u4e0d\u53ef\u80fd\u3002

\u5176\u5b9e\u51fa\u53d1\u70b9\u662f\u597d\u7684\uff0c\u53ea\u662f\u5bf9\u4e8e\u73b0\u5728\u7684\u5f00\u53d1\u8005\u4f3c\u4e4e\u610f\u4e49\u4e0d\u662f\u5f88\u5927\uff0c\u5f53\u7136\u5bf9\u4e8e\u65b0\u7684 \u8bed\u8a00 stage \u800c\u8a00\uff0c\u6216\u8bb8\u6709\u4e00\u4e9b\u610f\u4e49\u3002

"},{"location":"docs/2023/06/26/#3npm-keywords-keygen-cheat","title":"3.npm \u7981\u6b62\u53d1\u5e03 keywords \u5305\u542b keygen \u548c cheat \u7684\u5305","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://news.ycombinator.com/item?id=36325523

\u5f53\u4f60\u7684 npm \u5305\u4e2d\u5305\u542b\u4e86 keygen \u6216\u8005 cheat \uff0c\u4f1a\u88ab\u7981\u6b62\u53d1\u5e03\uff0c\u5927\u6982\u7684\u8ba8\u8bba\u5728\u94fe\u63a5\u4e2d\uff0c\u662f\u4e00\u4e2a\u76f8\u5bf9\u6bd4\u8f83\u6709\u4e89\u8bae\u7684\u8bdd\u9898\u3002

"},{"location":"docs/2023/06/26/#4ts-pattern","title":"4.ts-pattern","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/gvergnaud/ts-pattern#Pinfer

\u7528\u4e8e\u5199\u51fa\u9ad8\u9636 ts \u7c7b\u578b\u7684\u8f85\u52a9\u5de5\u5177\u5e93\uff0c\u66f4\u7b80\u77ed\u7684\u8bed\u53e5\u5b9e\u73b0\u66f4\u590d\u6742\u7684\u7c7b\u578b\u58f0\u660e\u3002

(: \u672c\u5468\u53ea\u6709\u56db\u6761\uff0c\u4e0d\u662f\u6577\u884d\uff0c\u662f\u6ca1\u6709\u4ec0\u4e48\u4f18\u8d28\u65b0\u95fb\uff5e

"},{"location":"docs/2023/06/26/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/06/27/","title":"Scholar's Weekly \u7b2c27\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/06/27/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a unsuckjs.com\u3001TypeScript\u3001Event Loop\u3001CSS In JS

"},{"location":"docs/2023/06/27/#1unsuckjscom","title":"1.unsuckjs.com","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/adamghill/unsuckjs.com

\u4f7f\u7528\u8f7b\u91cf\u7ea7 JavaScript \u5e93\u9010\u6b65\u589e\u5f3a HTML\u3002

\u66f4\u591a\u7684\u6709\u4e9b\u7c7b\u4f3c\uff1aawesome\uff0c\u4f46\u662f\u6dfb\u52a0\u4e86\u4e00\u4e9b\u6a2a\u5411\u5bf9\u6bd4\u53c2\u7167\u3002

"},{"location":"docs/2023/06/27/#2typescript-52-using","title":"2.TypeScript 5.2 \u7684\u65b0\u5173\u952e\u5b57\uff1a\u201cusing\u201d","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.totaltypescript.com/typescript-5-2-new-keyword-using

TypeScript 5.2 \u4e2d\u5373\u5c06\u65b0\u8fce\u6765\u4e00\u4e2a\u5173\u952e\u5b57\uff1ausing\uff0c\u5f53\u51fd\u6570\u79bb\u5f00\u4f5c\u7528\u57df\u65f6\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5904\u7406\u4efb\u4f55\u5185\u5bb9\u3002 \u8fd9\u5c31\u662f\u4e3b\u8981\u7684\u80fd\u529b\u3002

import { open } from \"node:fs/promises\";\nconst getFileHandle = async (path: string) => {\nconst filehandle = await open(path, \"r\");\nreturn {\nfilehandle,\n[Symbol.asyncDispose]: async () => {\nawait filehandle.close();\n},\n};\n};\n{\nawait using file = getFileHandle(\"thefile.txt\");\n// Do stuff with file.filehandle\n} // Automatically disposed!\n

\u5982\u4e0a\u6240\u8ff0\uff0c\u6211\u4eec\u4e0d\u5fc5\u5728 try...finally \u4e2d\u53bb\u91ca\u653e\u8d44\u6e90\uff0c\u66f4\u591a\u7684\u52a8\u673a\u8be6\u89c1\uff1aECMAScript \u663e\u5f0f\u8d44\u6e90\u7ba1\u7406

"},{"location":"docs/2023/06/27/#3-nodejs","title":"3.\u53ef\u89c6\u5316\u7684\u5f62\u5f0f\u4e86\u89e3 Node.js \u4e8b\u4ef6\u5faa\u73af\u5b8c\u6574\u6307\u5357","text":"

\u76f8\u5173\u5730\u5740\uff1bhttps://www.builder.io/blog/visual-guide-to-nodejs-event-loop#conclusion

\u5171\u8ba1 7 \u4e2a\u7cfb\u5217\uff0c\u63a8\u8350\u9605\u8bfb\uff1a

  • \u7b2c 1 \u90e8\u5206\uff1a\u53ef\u89c6\u5316 Node.js \u4e8b\u4ef6\u5faa\u73af
  • \u7b2c 2 \u90e8\u5206\uff1a\u5728 Node.js \u4e2d\u53ef\u89c6\u5316 nextTick \u548c Promise \u961f\u5217
  • \u7b2c 3 \u90e8\u5206\uff1a\u5728 Node.js \u4e2d\u53ef\u89c6\u5316\u8ba1\u65f6\u5668\u961f\u5217
  • \u7b2c 4 \u90e8\u5206\uff1a\u53ef\u89c6\u5316 Node.js \u4e8b\u4ef6\u5faa\u73af\u4e2d\u7684 I/O \u961f\u5217
  • \u7b2c 5 \u90e8\u5206\uff1a\u53ef\u89c6\u5316 Node.js \u4e8b\u4ef6\u5faa\u73af\u4e2d\u7684 I/O \u8f6e\u8be2
  • \u7b2c 6 \u90e8\u5206\uff1a\u53ef\u89c6\u5316 Node.js \u4e8b\u4ef6\u5faa\u73af\u4e2d\u7684\u68c0\u67e5\u961f\u5217
  • \u7b2c 7 \u90e8\u5206\uff1a\u53ef\u89c6\u5316 Node.js \u4e8b\u4ef6\u5faa\u73af\u4e2d\u7684\u5173\u95ed\u961f\u5217
"},{"location":"docs/2023/06/27/#4toad-scheduler","title":"4.toad-scheduler","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/kibertoad/toad-scheduler

\u5185\u5b58\u4e2d\u7684TypeScript\u4f5c\u4e1a\u8c03\u5ea6\u5668\uff0c\u5728\u6307\u5b9a\u7684\u65f6\u95f4\u95f4\u9694\u5185\u91cd\u590d\u6267\u884c\u7ed9\u5b9a\u7684\u4efb\u52a1\uff08\u4f8b\u5982\uff0c\"\u6bcf20\u79d2\"\uff09\u3002\u5982\u679c\u4f60\u9700\u8981\u7684\u8bdd\uff0c\u4e5f\u652f\u6301Cron\u8bed\u6cd5\u3002

"},{"location":"docs/2023/06/27/#5tesseractjs-411","title":"5.tesseract.js 4.1.1 \u53d1\u5e03","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/naptha/tesseract.js/releases/tag/v4.1.1

\u4fee\u590d\u4e86\u5904\u7406\u4f7f\u7528 iOS \u8bbe\u5907\u62cd\u6444\u56fe\u50cf\u7684\u5173\u952e\u9519\u8bef\u3002

"},{"location":"docs/2023/06/27/#6panda-css","title":"6.Panda CSS","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://panda-css.com/docs/why-panda#the-new-era-of-css-in-js

\u793e\u533a\u5df2\u7ecf\u6709\u5f88\u591a CSS In JS \u7684\u65b9\u6848\u548c\u5e93\u4e86\uff0c\u4f46\u662f\u5728 chakra ui \u80cc\u540e\u7684\u5149\u73af\u4eba\u7269\uff0c\u5e26\u7740\u4e00\u4e2a\u65b0\u7684\u89e3\u51b3\u65b9\u6848\u51fa\u73b0\u4e86\uff1b

\u52a8\u673a\uff1a

  • \u6d88\u9664\u7cdf\u7cd5\u7684\u8fd0\u884c\u65f6\u5f00\u9500\uff1b
  • \u4ee5\u652f\u6301 SRC \u548c SSR \u4f5c\u4e3a\u4e3b\u8981\u52a8\u673a\uff1b
"},{"location":"docs/2023/06/27/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/07/28/","title":"Scholar's Weekly \u7b2c28\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

"},{"location":"docs/2023/07/28/#fe-news","title":"FE News","text":"

\u5173\u952e\u8bcd\uff1a JavaScript\u3001TypeScript\u3001CommonJS\u3001startViewTransition

"},{"location":"docs/2023/07/28/#1javascript","title":"1.JavaScript\u7684\u4e0b\u4e00\u6b65\u662f\u4ec0\u4e48: \u671f\u5f85\u7684\u65b0\u529f\u80fd","text":"

\u5927\u4f53\u8ba1\u5212\u4f1a\u504f\u5411\u4e8e\uff1a

  • \u4e0d\u4f1a\u5c06 JavaScript \u8f6c\u6362\u4e3a TypeScript
  • \u539f\u751f JS \u652f\u6301\u56fd\u9645\u5316
"},{"location":"docs/2023/07/28/#2javascript","title":"2.\u8d85\u8d8a\u6d4f\u89c8\u5668\uff1aJavaScript \u6807\u51c6\u7684\u957f\u671f\u672a\u6765","text":"

\u5185\u5377\u7684\u5f00\u7aef\u4ece\u54ea\u91cc\u5462\uff1f

  • \u8de8\u8d8a\u6d4f\u89c8\u5668\u7684 Runtime
  • \u5f02\u6b65\u4e0a\u4e0b\u6587
"},{"location":"docs/2023/07/28/#3commonjs-javascript","title":"3.CommonJS \u6b63\u5728\u635f\u5bb3 JavaScript","text":"

\u6211\u89c9\u5f97\u6807\u9898\u6216\u591a\u6216\u5c11\u6709\u4e9b\u54d7\u4f17\u53d6\u5ba0\u4e86\uff0c\u56e0\u4e3a\u53ea\u662f\u4e00\u4e2a\u65f6\u4ee3\u7684\u8fc7\u6e21\u54c1\uff0c\u4f55\u51b5 Node 14.8 \u4e4b\u540e\u5df2\u7ecf\u652f\u6301\u4e86 ES \u6a21\u5757\uff0c\u6211\u4eec\u4e0d\u5e94\u8be5\u5426\u8ba4 CommonJs \u5728\u4f4e\u7248\u672c\u6d4f\u89c8\u5668\u6216\u8005 UMD \u601d\u60f3\u4e2d\u6240\u505a\u51fa\u7684\u8d21\u732e\u3002

"},{"location":"docs/2023/07/28/#4","title":"4.\u53bb\u9664\u56fe\u7247\u80cc\u666f\uff0c\u4f60\u662f\u600e\u4e48\u505a\u7684\u5462\uff1f","text":"
$ npm install @imgly/background-removal\n

\u501f\u52a9\u7b97\u6cd5\uff0c\u5728\u6d4f\u89c8\u5668\u7aef\u4f7f\u7528 JavaScript \u79fb\u9664\u56fe\u50cf\u80cc\u666f\u3002

"},{"location":"docs/2023/07/28/#5-domcontentloaded","title":"5.\u89e3\u8bfb DOMContentLoaded","text":"

\u4f60\u77e5\u9053 DOMContentLoaded \u7684\u6267\u884c\u65f6\u673a\u5417\uff1f

More accurately, DOMContentLoaded signifies that all blocking and defer and type=module code has finished running

"},{"location":"docs/2023/07/28/#6-api","title":"6.\u89c6\u56fe\u8f6c\u6362 API \u7b80\u4ecb","text":"

startViewTransition \u6d4f\u89c8\u5668\u89c6\u56fe\u8fc7\u6e21\u8f6c\u6362 API \u4ecb\u7ecd\u3002

"},{"location":"docs/2023/07/28/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/08/29/","title":"Scholar's Weekly \u7b2c29\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8->\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a htmlx\u3001web\u3001JSX\u3001EventListener

"},{"location":"docs/2023/08/29/#fe-news","title":"FE News","text":""},{"location":"docs/2023/08/29/#1htmlx-github","title":"1.htmlx \u6210\u4e3a GitHub \u52a0\u901f\u5668\u7684\u4e00\u90e8\u5206","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://htmx.org

  • \u52a8\u673a\uff1a\u7eaf html \u53d1\u8bf7\u6c42\u3001\u8c03\u7528\u4e8b\u4ef6......
"},{"location":"docs/2023/08/29/#22023-10-web","title":"2.2023 \u5e74\u7684 10 \u4e2a web \u8d8b\u52bf","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.robinwieruch.de/web-development-trends/

  • \u6e32\u67d3\u6a21\u5f0f\uff1a\u4ece CSR -> SSR -> SSG
  • \u8fb9\u7f18\u670d\u52a1\u5668\uff1aServerless\uff08AWS\u3001Cloudfire\uff09
  • JavaScript \u8fd0\u884c\u65f6\uff1aDeno
  • Monorepo\uff1aTurborepo
  • CSS\uff1aTailwind CSS
  • \u7c7b\u578b\u5b89\u5168\uff1aTypeScript
  • \u6784\u5efa\u5de5\u5177\uff1awebpack -> vite
  • AI IDE\uff1aGitHub Copilot
  • \u684c\u9762\u5e94\u7528\u6846\u67b6\uff1aElectron -> Tauri
  • E2E\u6d4b\u8bd5\uff1aCypress -> Playwright
  • Shell\uff1aIterm -> Warp & Fig
"},{"location":"docs/2023/08/29/#3jsx-without-react","title":"3.JSX without React","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://chriscoyier.net/2023/08/07/jsx-without-react/

\u6ca1\u6709\u5b8c\u6574\u7684 React \u6846\u67b6\u7a0b\u5e8f\uff0c\u4f60\u4e00\u6837\u53ef\u4ee5\u6e32\u67d3 JSX\u3002

\u52a8\u673a\uff1aSSG \uff1f

\u6216\u8bb8\u5728 SSG \u5e94\u7528\u4e2d\u53ef\u4ee5\u5c1d\u8bd5\u3002

"},{"location":"docs/2023/08/29/#4","title":"4.\u51e0\u79cd\u5220\u9664\u4e8b\u4ef6\u76d1\u542c\u7684\u65b9\u6848","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.macarthur.me/posts/options-for-removing-event-listeners

  • removeEventListener
  • addOnce
  • Cloning & Replacing the Node
  • AbortController
"},{"location":"docs/2023/08/29/#5-react","title":"5.\u56e0\u4e3a React\uff0c\u4f60\u6240\u5fd8\u8bb0\u7684\u4e00\u4e9b\u4e8b","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://joshcollinsworth.com/blog/antiquated-react

"},{"location":"docs/2023/08/29/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2023/09/30/","title":"Scholar's Weekly \u7b2c30\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 stocksnap)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8->\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a TypeScript\u3001Optics\u3001React Email\u3001Animation

"},{"location":"docs/2023/09/30/#fe-news","title":"FE News","text":""},{"location":"docs/2023/09/30/#1react-typescript","title":"1.React \u5b98\u65b9\u51fa\u7684 TypeScript \u6559\u7a0b","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://react.dev/learn/typescript

\u96be\u5f97\u4e00\u89c1\u5b98\u65b9\u5982\u6b64\u826f\u5fc3\uff0c\u5bf9\u4e8e\u5373\u5c06\u5b66\u4e60 React \u65b0\u624b\u6765\u8bf4\uff0c\u662f\u4e2a\u4e0d\u9519\u7684\u6307\u5f15\u3002

"},{"location":"docs/2023/09/30/#2comparing-optics-with-jotai","title":"2.Comparing Optics with Jotai","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://unfocused.blog/posts/comparing-optics-with-jotai

Optics \u4e00\u4e2a\u65b0\u7684\u3001\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u72b6\u6001\u7ba1\u7406\u5e93\uff0c\u6587\u7ae0\u4f5c\u8005\u4e3b\u8981\u5c31\u5171\u6027\u4e0e jotai \u505a\u4e86\u5bf9\u6bd4\u3002

\uff08\uff1a\u8bdd\u8bf4\u6211\u6b63\u5728\u82e6\u607c\uff0c\u600e\u4e48\u628a recoil \u5207\u5230 jotai\uff0c\u6b63\u5728\u7814\u7a76\u94a9\u5b50\u590d\u5199\u66ff\u6362\u3002

"},{"location":"docs/2023/09/30/#3-react-email","title":"3.\u4f7f\u7528 React Email \u521b\u5efa\u7535\u5b50\u90ae\u4ef6\u6a21\u7248","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://spacejelly.dev/posts/create-email-templates-with-react-js-using-react-email/

\u5de5\u5177\uff1a - Resend - React Email

\u7ed9\u81ea\u5df1\u8bb0\u4e00\u4e2a\u5f85\u529e\uff0c\u5468\u672b\u7684\u4e00\u5b9a\u8981\u73a9\u4e00\u73a9\uff0c\u642d\u5efa\u4e00\u4e2a\u57df\u540d\u4e3a\uff1aemail.bigdreamer.cc \u6216\u8005 email.binlin.wang \u7684\u5c0f\u7834\u7ad9\u3002

"},{"location":"docs/2023/09/30/#4","title":"4.\u4e00\u4e2a\u521b\u5efa\u52a8\u753b\u7684\u8f85\u52a9\u5de5\u5177","text":"

\u53ef\u4ee5\u4ece\u91cc\u9762\u8bbe\u8ba1\u597d\u52a8\u753b\uff0c\u76f4\u63a5 copy \u51fa\uff1aCSS \u3001SCSS \u3001Swift \u3001Obj-C

"},{"location":"docs/2023/09/30/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/01/31/","title":"Scholar's Weekly \u7b2c31\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 pixabay)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a React\u3001deepClone\u3001styleX\u3001Css-In-Js

"},{"location":"docs/2024/01/31/#fe-news","title":"FE News","text":""},{"location":"docs/2024/01/31/#1","title":"1.\u73b0\u4ee3\u5316\u6df1\u514b\u9686","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.builder.io/blog/structured-clone

\u73b0\u4ee3\u5316\u7684\u514b\u9686\u65b9\u5f0f\uff1a

  • structuredClone

\u6d4f\u89c8\u5668\u57fa\u7ebf\uff0c\u73b0\u4ee3\u5316\u7684\u6d4f\u89c8\u5668\u57fa\u672c\u90fd\u5f97\u5230\u4e86\u652f\u6301\uff0c\u5e76\u4e14\u5728 Web Worker \u4e2d\u53ef\u7528\u3002

const atom = {\nyear: '2024',\nhelloMsg: '\u65b0\u5e74\u5feb\u4e50',\ndate: new Date(),\n}\n\nconst cloneAtom = structuredClone(atom);\n

\u4ec0\u4e48\u4e0d\u80fd\u514b\u9686

  • \u51fd\u6570
  • DOM \u8282\u70b9
  • \u5c5e\u6027\u63cf\u8ff0\u7b26\uff1agetter\u3001setter
  • \u5bf9\u8c61\u539f\u578b
"},{"location":"docs/2024/01/31/#2webcomponent-js","title":"2.WebComponent \u5c06\u6bd4\u4efb\u4f55 JS \u6846\u67b6\u90fd\u957f\u5bff","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://jakelazaroff.com/words/web-components-will-outlive-your-javascript-framework/

\u5176\u5b9e\u6211\u662f\u8ba4\u540c\u7684\uff0c\u8fd9\u4e2a\u89c2\u70b9\u6bd4\u8f83\u9c9c\u660e\uff0c\u8de8\u6846\u67b6\u751f\u6001\u7684\u7ec4\u4ef6\u5f62\u5f0f\u8fd8\u662f\u53ef\u4ee5\u7684\uff0c\u501f\u52a9\u5f71\u5b50 DOM \u5177\u5907\u5929\u7136\u7684\u6c99\u7bb1\u7cfb\u7edf\u3002

\u4f5c\u8005\u5728\u539f\u6587\u4e2d\u4e3e\u4e86\u5f88\u591a\u793a\u4f8b\uff0c\u8fd8\u662f\u6bd4\u8f83\u6709\u610f\u601d\u7684\u3002

"},{"location":"docs/2024/01/31/#3stylex","title":"3.StyleX","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://stylexjs.com/blog/introducing-stylex/

\u7531 Meta \u5f00\u53d1\u7684\u4e00\u4e2a\u65b0\u7684 CSS-IN-JS \u7684\u5e93\u3002

  • \u7f16\u8bd1\u65f6\u548c\u8fd0\u884c\u65f6\u90fd\u5f88\u5feb\uff1b
  • \u5c0f\u5316 CSS \u4ea7\u7269\u7684\u4f53\u79ef\uff1b
  • \u9632\u6b62\u51b2\u7a81\uff1b
  • Tree-Shaking
"},{"location":"docs/2024/01/31/#4-react","title":"4.\u4f18\u5316 React \u4e2d\u7684\u91cd\u590d\u6e32\u67d3","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.sentry.io/fixing-memoization-breaking-re-renders-in-react/?utm_source=reactstatus&utm_medium=paid-community&utm_campaign=general-fy24q4-jtbd&utm_content=newsletter-jtbdblog-read

\u5185\u5bb9\u6709\u4e9b\u7b80\u964b\uff0c\u5c31\u662f\u7b80\u5355\u7684\u4ecb\u7ecd\u4e86 useCallback \u548c memo \u6765\u4f18\u5316\u7ec4\u4ef6\u3002

"},{"location":"docs/2024/01/31/#5react-2","title":"5.React \u4e2d\u591a\u6001\u6027\uff082\u79cd\u6a21\u5f0f\uff09","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.bekk.christmas/post/2023/1/polymorphism-in-react

\u5185\u5bb9\u4e5f\u5f88\u7b80\u964b\uff0c\u6709\u5174\u8da3\u53ef\u4ee5\u8bfb\u4e00\u8bfb\uff1a - Button \u4f5c\u4e3a\u5c55\u793a\u5143\u7d20 - Button \u4f5c\u4e3a Parent \u5177\u5907\u63d2\u69fd\u80fd\u529b

\u4f46\u662f\u6211\u89c9\u5f97\u6587\u7ae0\u4e2d\u7684 asChild \u6709\u4e9b\u591a\u4f59\uff0c\u91cd\u65b0\u5199\u4e00\u4e2a\u7ec4\u4ef6\u4e0d\u5c31\u597d\u4e86\uff0c\u4fdd\u6301\u7ec4\u4ef6\u7684\u5355\u4e00\u529f\u80fd\u539f\u5219\u3002

"},{"location":"docs/2024/01/31/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/01/32/","title":"Scholar's Weekly \u7b2c32\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 pixabay)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a JS\u3001with\u3001Array

"},{"location":"docs/2024/01/32/#fe-news","title":"FE News","text":""},{"location":"docs/2024/01/32/#12024-javascript-10","title":"1.2024 \u5e74\u6bcf\u4e2a JavaScript \u5f00\u53d1\u4eba\u5458\u90fd\u5e94\u8be5\u77e5\u9053\u7684 10 \u4e2a\u9762\u8bd5\u95ee\u9898","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-in-2024-c1044bcb0dfb

  1. \u4ec0\u4e48\u662f\u95ed\u5305\uff1f
  2. \u4ec0\u4e48\u662f\u7eaf\u51fd\u6570\uff1f
  3. \u4ec0\u4e48\u662f\u51fd\u6570\u7ec4\u5408\uff1f
  4. \u4ec0\u4e48\u662f\u51fd\u6570\u5f0f\u7f16\u7a0b\uff1f
  5. \u4ec0\u4e48\u662f Promise\uff1f
  6. \u4ec0\u4e48\u662fTypeScript\uff1f
  7. \u4ec0\u4e48\u662f Web Component\uff1f
  8. \u4ec0\u4e48\u662f React Hook\uff1f
  9. \u5982\u4f55\u5728 React \u4e2d\u521b\u5efa\u70b9\u51fb\u8ba1\u6570\u5668\uff1f
  10. \u4ec0\u4e48\u662f\u6d4b\u8bd5\u9a71\u52a8\u5f00\u53d1\uff08TDD\uff09\uff1f
"},{"location":"docs/2024/01/32/#2-javascript-with","title":"2.\u8ba9\u6211\u4eec\u56de\u987e\u4e00\u4e0b JavaScript \u7684 with() \u8bed\u53e5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://macarthur.me/posts/with

\u4f5c\u8005\u610f\u56fe\u5f88\u9c9c\u660e\uff0c\u201cwith\u201d \u6240\u5e26\u6765\u7684\u98ce\u9669\u548c\u6311\u6218\u88ab\u5938\u5927\u4e86\u3002\uff08\uff1a\u6211\u4fdd\u6301\u4e2d\u7acb\u6001\u5ea6

\u7f3a\u70b9\uff1a

  • \u4e25\u683c\u6a21\u5f0f\u4e0d\u652f\u6301
  • \u8303\u56f4\u6cc4\u6f0f
  • \u6027\u80fd
with (data) {\nawait saveToDb({\nimageUrl,\nwidth,\nheight,\n});\n}\n

\u4f46\u662f\u6211\u8fd8\u662f\u540c\u610f\u628a\u5b83\u653e\u5728 CLI \u7a0b\u5e8f\u7f16\u5199\u4e2d\u5b9e\u73b0\uff0c\u81f3\u4e8e\u751f\u4ea7\u4ee3\u7801\u5219\u4e0d\u63a8\u8350\uff0c\u56e0\u4e3a\u4e25\u683c\u6a21\u5f0f\u4e0d\u652f\u6301\u3002

\u5176\u5b9e ES6 \u7684\u7ed3\u6784\u5df2\u7ecf\u76f8\u5f53\u4f18\u5f02\u4e86\u3002

"},{"location":"docs/2024/01/32/#3-javascript","title":"3.\u7406\u89e3\u6beb\u65e0\u610f\u4e49\u7684 JavaScript \u7279\u6027","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.smashingmagazine.com/2023/12/making-sense-of-senseless-javascript-features/

  • 0.1 + 0.2 != 0.3
  • \u5f3a\u5236\u7c7b\u578b\u8f6c\u6362
  • 1 == true
  • \"2\" == 2
  • ASI \u673a\u5236\uff08\u81ea\u52a8\u5206\u53f7\u63d2\u5165\u673a\u5236\uff09
  • \u57fa\u7840\u6570\u636e\u7c7b\u578b\u592a\u591a
  • null \u3001 undefined \u3001NaN
  • ++ \u548c --

\u867d\u7136\u786e\u5b9e\u6709\u4e9b\u56f0\u60d1\uff0c\u4f46\u662f\u57fa\u4e8e\u5386\u53f2\u539f\u56e0\uff0c\u53ef\u4ee5\u7406\u89e3\u548c\u63a5\u53d7\uff0c\u53ea\u662f\u9700\u8981\u5728\u65e5\u5e38\u5f00\u53d1\u4e2d\u591a\u5bb6\u6ce8\u610f\u3002

"},{"location":"docs/2024/01/32/#42023-javascript","title":"4.2023\u5e74\u4e00\u4e9b\u65b0\u7684 javaScript \u6570\u7ec4\u65b9\u6cd5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://12daysofweb.dev/2023/new-js-array-methods/

\u6ce8\uff1a\u4ee5\u4e0b\u793a\u4f8b\u6765\u6e90\u4e8e\u539f\u6587

  • toReversed - \u4e0d\u4fee\u6539\u539f\u6570\u7ec4\u7684\u6761\u4ef6\u4e0b\u53cd\u8f6c\u6570\u7ec4
const arr = [\"Merlin\", \"Ursula\", \"Gandalf\"];\n\nconst reverseArr = arr.toReversed();\n\n// logs [\"Gandalf\", \"Ursula\", \"Merlin\"]\nconsole.log(reverseArr);\n\n// logs [\"Merlin\", \"Ursula\", \"Gandalf\"]\nconsole.log(arr);\n
  • toSpliced - \u4e0d\u4fee\u6539\u539f\u6570\u7ec4\u7684\u60c5\u51b5\u4e0b\u6570\u7ec4\u62fc\u63a5
const wizards = ['Merlin', 'Ursula', 'Gandalf', 'Radagast'];\n\nconst lessWizards = wizards.toSpliced(2, 1);\n\n// logs ['Merlin', 'Ursula', 'Gandalf', 'Radagast']\nconsole.log(wizards);\n\n// logs ['Merlin', 'Ursula', 'Radagast']\nconsole.log(lessWizards);\n
  • toSorted - \u4e0d\u4fee\u6539\u539f\u6570\u7ec4\u7684\u524d\u63d0\u4e0b\uff0c\u8fdb\u884c\u6392\u5e8f
let sortedWizards = wizards.toSorted();\n\n// logs ['Merlin', 'Ursula', 'Gandalf', 'Radagast']\nconsole.log(wizards);\n\n// logs ['Gandalf the Gray', 'Merlin', 'Ursula of the Sea']\nconsole.log(sortedWizards);\n
  • with - \u4e0d\u4fee\u6539\u539f\u6570\u7ec4\u7684\u524d\u63d0\u4e0b\uff0c\u8fdb\u884c\u4fee\u6539\u6307\u5b9a\u7d22\u5f15\u7684\u6570\u636e\u503c
let differentWizards = wizards.with(2, 'Radagast');\n\n// logs ['Merlin', 'Ursula', 'Gandalf']\nconsole.log(wizards);\n\n// logs ['Merlin', 'Ursula', 'Radagast']\nconsole.log(differentWizards);\n
"},{"location":"docs/2024/01/32/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/01/33/","title":"Scholar's Weekly \u7b2c33\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 pixabay)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a fsx\u3001js\u3001remoteStorage

"},{"location":"docs/2024/01/33/#fe-news","title":"FE News","text":""},{"location":"docs/2024/01/33/#1-jser-33","title":"1. \u6bcf\u4e00\u4e2a Jser \u90fd\u5e94\u8be5\u77e5\u9053\u7684 33 \u4e2a\u6982\u5ff5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/leonardomso/33-js-concepts?tab=readme-ov-file#-table-of-contents \u5982\u56fe\u6240\u793a\uff0c\u4ec5\u5217\u4e86\u90e8\u5206\uff0c\u90fd\u662f\u4e00\u4e9b\u6bd4\u8f83\u6838\u5fc3\u4e14\u53c8\u57fa\u7840\u7684\u6982\u5ff5\uff0c\u53ef\u4ee5\u518d\u6e29\u4e60\u4e00\u904d\u3002

"},{"location":"docs/2024/01/33/#2fsx","title":"2.fsx","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/humanwhocodes/fsx

\u4e00\u4e2a\u73b0\u4ee3\u5316\u7684 fs \u7cfb\u7edf\uff1a

\u8bfb\u6587\u4ef6

// read plain text\nconst text = await fsx.text(\"/path/to/file.txt\");\n\n// read JSON\nconst json = await fsx.json(\"/path/to/file.json\");\n\n// read bytes\nconst bytes = await fsx.arrayBuffer(\"/path/to/file.png\");\n
\u5199\u6587\u4ef6

// write a string\nawait fsx.write(\"/path/to/file.txt\", \"Hello world!\");\n\nconst bytes = new TextEncoder().encode(\"Hello world!\").buffer;\n\n// write a buffer\nawait fsx.write(\"/path/to/file.txt\", bytes);\n

\u68c0\u6d4b

if (await fsx.isFile(\"/path/to/file.txt\")) {\n// handle the file\n}\n

\u5220\u9664

// delete a file\nawait fsx.delete(\"/path/to/file.txt\");\n\n// delete a directory\nawait fsx.delete(\"/path/to\");\n

\u6211\u4e2a\u4eba\u4f7f\u7528\u4e0b\u6765\u7684\u7684\u611f\u5b98\uff0c\u6bd4\u539f\u751f\u7684 fs \u8981\u597d\u7528\u7684\u591a\uff0c\u5b8c\u5168\u7684 Promise \u66f4\u7b26\u5408\u73b0\u4ee3\u7f16\u7a0b\u3002

"},{"location":"docs/2024/01/33/#3drawinggarden","title":"3.drawing.garden","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://drawing.garden

\u4e00\u4e2a\u53ef\u4ee5\u8ddf\u968f\u9f20\u6807\u79fb\u52a8\u753b\u753b\u7684\u7f51\u7ad9\uff0c\uff08\uff1a\u8bf4\u5b9e\u8bdd\uff0c\u633a\u65e0\u8da3\u7684\uff0c\u4f46\u662f\u6211\u8fd8\u6bd4\u8f83\u611f\u5174\u8da3\uff0clol......

\u6211\u81ea\u5df1\u6f5c\u753b\u4e86\u4e00\u4e2a\u201c\u4e00\u7bad\u7a7f\u5fc3\ud83d\udc98\u201d\uff0c\u8fd8\u884c\u5427\uff08\uff1a\u4e11\u4e11\u7684

"},{"location":"docs/2024/01/33/#4jsondiffpatch","title":"4.jsondiffpatch","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/benjamine/jsondiffpatch

\u5982\u679c\u4f60\u548c\u6211\u4e00\u6837\u5728\u5bfb\u627e\u4e00\u4e2a json diff \u7684\u5e93\uff0c\u90a3\u4e48\u6211\u6781\u529b\u63a8\u8350\uff1ajsondiffpatch

import * as jsondiffpatch from 'jsondiffpatch';\nconst jsondiffpatchInstance = jsondiffpatch.create(options);\n

\u6700\u5f3a\u5927\u83ab\u8fc7\u4e8e Diff Pretty Output\uff0c\u8fd9\u70b9\u80fd\u529b\u662f\u6bd4\u8f83\u597d\u7684\u3002

"},{"location":"docs/2024/01/33/#5remotestorage","title":"5.remoteStorage","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/FrigadeHQ/remote-storage

\u4e3a\u6bdb\u6211\u611f\u89c9\u6709\u4e9b\u9e21\u808b\u5462\uff1fredis \u4e0d\u9999\u4e86\u5417\uff1f\u4e0d\u8fc7\u53ef\u80fd\u4f5c\u8005\u6709\u81ea\u5df1\u7684\u52a8\u673a\uff1a

\u4f8b\u5982\uff0c\u5047\u8bbe\u60a8\u5e0c\u671b\u5411\u6240\u6709\u65b0\u6ce8\u518c\u4ea7\u54c1\u7684\u7528\u6237\u663e\u793a\u4e00\u4e2a\u6b22\u8fce\u6a21\u6001\u6846\u3002\u5982\u679c\u60a8\u4f7f\u7528localStorage\u6765\u8ddf\u8e2a\u7528\u6237\u662f\u5426\u5df2\u7ecf\u770b\u8fc7\u6b64\u6a21\u6001\u6846\uff0c\u5219\u6bcf\u5f53\u4ed6\u4eec\u5207\u6362\u8bbe\u5907\u6216\u6d4f\u89c8\u5668\u65f6\uff0c\u7528\u6237\u5c06\u7ee7\u7eed\u91cd\u590d\u83b7\u5f97\u8fd9\u79cd\u4f53\u9a8c\u3002

\u4ee5 uuid \u4f5c\u4e3a\u5b9e\u4f8b\uff0c\u6269\u5c55\u591a\u4f8b\uff0c\u652f\u6301\u670d\u52a1 docker \u81ea\u90e8\u7f72\u3002

"},{"location":"docs/2024/01/33/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/01/34/","title":"Scholar's Weekly \u7b2c34\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 shopify)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a React Library\u3001Syntax\u3001Assert\u3001CSS

"},{"location":"docs/2024/01/34/#fe-news","title":"FE News","text":""},{"location":"docs/2024/01/34/#12024react","title":"1.\u76d8\u70b92024\u5e74\u7684React\u5e93","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.robinwieruch.de/react-libraries/

\u4e0b\u9762\u4ec5\u4ec5\u662f\u90e8\u5206\u5185\u5bb9\uff0c\u5168\u90e8\u5185\u5bb9\u53ef\u4ee5\u70b9\u5f00\u76f8\u5173\u5730\u5740\u67e5\u770b\u9605\u8bfb\uff1a

"},{"location":"docs/2024/01/34/#2syntax","title":"2.Syntax \u64ad\u5ba2","text":"

Yagiz Nizipli \u8ba8\u8bba\u4e86\u4ed6\u8d21\u732e\u7684 Node.js \u6027\u80fd\u6539\u8fdb\u3001\u4f18\u5316\u6280\u672f\u3001URL \u7684\u590d\u6742\u6027\u4ee5\u53ca\u652f\u6301\u672a\u6765 TypeScript \u652f\u6301\u7684\u56e0\u7d20\u3002

\u5982\u4e0b\u662f\u64ad\u5ba2\uff0c\u5168\u7a0b\u82f1\u6587\uff0c\u542c\u529b\u597d\u70b9\u7684\u540c\u5b66\u53ef\u4ee5\u6233\u3010\u9605\u8bfb\u539f\u6587\u3011\u5165\u8033\uff0c\u5fae\u4fe1\u516c\u7cbd\u53f7\u4e0d\u4e00\u5b9a\u53ef\u4ee5\u652f\u6301\u3002

Ready To Listen"},{"location":"docs/2024/01/34/#3","title":"3.\u65ad\u8a00\u7684\u9ec4\u91d1\u6cd5\u5219","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.epicweb.dev/the-golden-rule-of-assertions

\"\u5f53\u4e14\u4ec5\u5f53\u672a\u6ee1\u8db3\u7cfb\u7edf\u80cc\u540e\u7684\u610f\u56fe\u65f6\uff0c\u6d4b\u8bd5\u5fc5\u5b9a\u5931\u8d25\u3002\"

\u201c\u9ec4\u91d1\u6cd5\u5219\u201d \u5982\u4e0a\uff0c\u56e0\u4e3a\u65e9\u524d\u4e5f\u63a5\u89e6\u8fc7\u5355\u5143\u6d4b\u8bd5\uff0c\u6d45\u89e3\u8fc7 TDD\u3001BDD \u6d4b\u8bd5\u6cd5\u5219\uff0c\u5927\u767d\u8bdd\u7ffb\u8bd1\u4e00\u4e0b\u8fd9\u4e2a\u201c\u6cd5\u5219\u201d\uff0c\u5176\u5b9e\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u300c\u4e0d\u8981\u8fc7\u5206\u5173\u6ce8\u5185\u90e8\u5b9e\u73b0\uff0c\u4e00\u4e2a\u8f93\u5165\u4fdd\u6301\u4e00\u4e2a\u8f93\u51fa\uff0c\u4f5c\u4e3a\u6d4b\u8bd5\u6267\u884c\u7684\u5927\u524d\u63d0\u300d\u3002

"},{"location":"docs/2024/01/34/#42024-5-css","title":"4.2024 \u5e74\u6bcf\u4f4d\u524d\u7aef\u5f00\u53d1\u8005\u90fd\u5e94\u77e5\u9053\u7684 5 \u4e2a CSS \u4ee3\u7801\u6bb5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://web.dev/articles/5-css-snippets-every-front-end-developer-should-know-in-2024?hl=zh-cn

  • CSS:has(.potential-beyond-being-a-parent-selector)
    button:has(.icon) {\ngap: 1ch;\n}\n\n.card:has(img) {\ngrid-auto-flow: row;\n}\n
  • \u521b\u5efa\u5b50\u7f51\u683c\u5e03\u5c40
    body {\ndisplay: grid;\ngrid-template-columns: repeat(auto-fill, minmax(30ch, 1fr));\n\n> article {\ndisplay: grid;\ngrid-row: span 4; grid-template-rows: subgrid;\n}\n}\n
  • \u5d4c\u5957 CSS \u7684\u65b9\u5f0f
    .you {\n.can-totally-ship-this {\n&.if-you-wanted {\n/* it's VERY MUCH like SCSS */\n\n&:is(:hover, :focus-visible) {\n/* put a bird on it */\n}\n}\n}\n}\n\n.for-theming {\n@media (prefers-color-scheme: dark) {\n/* you can nest media queries */\n}\n}\n\n/* or for theming with [data-theme=\"dark\"] */\n.button {\nbackground: black;\ncolor: white;\n\n/* nest and do more than just append, flip it and reverse it */\n[data-theme=\"dark\"] & {\nbackground: white;\ncolor: black;\n}\n}\n
  • \u8ba9\u6d4f\u89c8\u5668\u5e73\u8861\u6807\u9898
  • \u4f7f\u7528\u5bb9\u5668\u67e5\u8be2\u5355\u5143
    .card {\n:is(h2,h3) {\nfont-size: clamp(1.5rem, 5cqi, 4rem);\n}\n\nimg {\ninline-size: 100cqi;\n\n@container (orientation: landscape) {\ninline-size: 50cqi;\n}\n}\n}\n
"},{"location":"docs/2024/01/34/#5","title":"5.\u4e00\u4e2a\u8f7b\u91cf\u7684\u6027\u80fd\u6d4b\u8bd5\u5de5\u5177","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/tinylibs/tinybench

import { Bench } from 'tinybench';\n\nconst bench = new Bench({ time: 100 });\n\nbench\n.add('faster task', () => {\nconsole.log('I am faster')\n})\n.add('slower task', async () => {\nawait new Promise(r => setTimeout(r, 1)) // we wait 1ms :)\nconsole.log('I am slower')\n})\n.todo('unimplemented bench')\n\nawait bench.warmup(); // make results more reliable, ref: https://github.com/tinylibs/tinybench/pull/50\nawait bench.run();\n\nconsole.table(bench.table());\n\n// Output:\n// \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2502 (index) \u2502   Task Name   \u2502 ops/sec  \u2502 Average Time (ns)  \u2502  Margin   \u2502 Samples \u2502\n// \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n// \u2502    0    \u2502 'faster task' \u2502 '41,621' \u2502 24025.791819761525 \u2502 '\u00b120.50%' \u2502  4257   \u2502\n// \u2502    1    \u2502 'slower task' \u2502  '828'   \u2502 1207382.7838323202 \u2502 '\u00b17.07%'  \u2502   83    \u2502\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\nconsole.table(\nbench.table((task) => {'Task name': task.name})\n);\n\n// Output:\n// \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2502 (index) \u2502       Task name       \u2502\n// \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n// \u2502    0    \u2502 'unimplemented bench' \u2502\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n
"},{"location":"docs/2024/01/34/#6worker-timers","title":"6.worker-timers","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/chrisguttandin/worker-timers

\u52a8\u673a\uff1a\u4e3b\u7ebf\u7a0b\u7684 setTimeout \u4f1a\u6302\u8d77\uff0c\u53ef\u4ee5\u5728 webWorker \u4e2d\u4f7f\u7528\u3002

"},{"location":"docs/2024/01/34/#7sutrajs","title":"7.Sutra.js","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/yantra-core/Sutra.js

\u5bf9 Tree \u6570\u636e\u7684\u7ba1\u7406\uff0c\u6027\u80fd\u63d0\u5347\u65b9\u9762\u4e0d\u8be6\uff0c\u4f46\u662f\u8bed\u6cd5\u7cd6\u633a\u597d\uff0c\u53ef\u4ee5\u5728\u4e1a\u52a1\u4e0a\u4e00\u8bd5\u3002

    let sutra = SUTRA.createSutra();\nsutra\n.if('isBoss')\n.if('isHealthLow')\n.then('updateEntity', { color: 0xff0000, speed: 5 });\n
"},{"location":"docs/2024/01/34/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/01/35/","title":"Scholar's Weekly \u7b2c35\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 shopify)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a Bun\u3001mutative\u3001Web Worker\u3001React 18

"},{"location":"docs/2024/01/35/#fe-news","title":"FE News","text":""},{"location":"docs/2024/01/35/#1the-bun-shell","title":"1.The Bun Shell","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://bun.sh/blog/the-bun-shell

\u8fc7\u53bb\u7531\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u4e0d\u4e00\u81f4\u6027\uff0cwindows\u3001linux\u3001macos \u7b49\u64cd\u4f5c\u4e00\u4e9b\u4e00\u81f4\u6027\u7684 shell \u547d\u4ee4\u5f02\u5e38\u56f0\u96be\uff0c\u6211\u4eec\u9700\u8981\u7c7b\u4f3c\u7684 polyfill \u6765\u4e66\u5199\u8de8\u5e73\u53f0\u7684 cli \u811a\u672c\u3002

bun \u4f5c\u4e3a\u5b9e\u9a8c\u6027\u8d28\u7684\u5d4c\u5165\u5f0f\u8bed\u8a00\u548c\u89e3\u91ca\u5668\uff0c\u5b9e\u73b0\u4e86\u81ea\u5df1\u7684\u4e00\u5957\u7684\u8de8\u5e73\u53f0\u89e3\u51b3\u65b9\u6848\uff0c\u4f8b\u5982\uff1a

import { $ } from \"bun\";\n\nawait $`cd .. && rm -rf node_modules/rimraf`;\n
"},{"location":"docs/2024/01/35/#2mutative","title":"2.mutative","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/unadlib/mutative

\u7ee7 immer \u4e4b\u540e\u7684\u53c8\u4e00\u4e2a \u4e0d\u53ef\u53d8\u6570\u636e \u64cd\u4f5c\u5e93\uff0c\u6027\u80fd\u53f7\u79f0\u6bd4 immer \u5feb 10x\u3002

"},{"location":"docs/2024/01/35/#3workerpool","title":"3.workerpool","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://github.com/josdejong/workerpool

workerpool \u63d0\u4f9b\u4e86\u4e00\u79cd\u521b\u5efa\u5de5\u4f5c\u6c60\u7684\u7b80\u5355\u65b9\u6cd5\uff0c\u7528\u4e8e\u52a8\u6001\u5378\u8f7d\u8ba1\u7b97\u4ee5\u53ca\u7ba1\u7406\u4e13\u7528\u5de5\u4f5c\u6c60\u3002workerpool \u57fa\u672c\u4e0a\u5b9e\u73b0\u4e86\u7ebf\u7a0b\u6c60\u6a21\u5f0f\u3002\u6709\u4e00\u4e2a\u5de5\u4f5c\u4eba\u5458\u6c60\u6765\u6267\u884c\u4efb\u52a1\u3002\u65b0\u4efb\u52a1\u88ab\u653e\u5165\u961f\u5217\u4e2d\u3002\u5de5\u4f5c\u4eba\u5458\u4e00\u6b21\u6267\u884c\u4e00\u4e2a\u4efb\u52a1\uff0c\u5b8c\u6210\u540e\u4ece\u961f\u5217\u4e2d\u9009\u62e9\u4e00\u4e2a\u65b0\u4efb\u52a1\u3002\u53ef\u4ee5\u901a\u8fc7\u81ea\u7136\u7684\u3001\u57fa\u4e8e\u627f\u8bfa\u7684\u4ee3\u7406\u6765\u8bbf\u95ee\u5de5\u4f5c\u4eba\u5458\uff0c\u5c31\u597d\u50cf\u5b83\u4eec\u53ef\u4ee5\u76f4\u63a5\u5728\u4e3b\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4e00\u6837\u3002

Workerpool \u5728 Node.js\u3001Chrome\u3001Firefox\u3001Opera\u3001Safari \u548c IE10+ \u4e0a\u8fd0\u884c\u3002

"},{"location":"docs/2024/01/35/#4culorjs","title":"4.culorjs","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://culorijs.org/

Culori \u662f\u4e00\u4e2a JavaScript \u989c\u8272\u5e93\uff0c\u652f\u6301 CSS Colors Level 4 \u89c4\u8303\u4e2d\u5b9a\u4e49\u7684\u6240\u6709\u683c\u5f0f\u4ee5\u53ca\u5176\u4ed6\u989c\u8272\u7a7a\u95f4\u7684\u8f6c\u6362\u548c\u64cd\u4f5c\u3002\u5b83\u53ef\u4ee5\u5904\u7406\u989c\u8272\u5dee\u5f02\u3001\u63d2\u503c\u3001\u6e10\u53d8\u3001\u6df7\u5408\u6a21\u5f0f\u7b49\u7b49\u3002

"},{"location":"docs/2024/01/35/#5sonarqube-react-18","title":"5.SonarQube \u56e2\u961f\u5347\u7ea7\u5230 React 18 \u7684\u7ecf\u9a8c\u53ea\u8c08","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.sonarsource.com/blog/upgrading-react-18-sonarqube

\u4e3b\u8981\u6709\u4ee5\u4e0b\u4e09\u4e2a\u95ee\u9898\uff1a

  • \u4e00\u4e9b TypeScript \u7c7b\u578b\u53d1\u751f\u4e86\u53d8\u5316
  • npx types-react-codemod preset-18 ./src \u53ef\u4ee5\u501f\u52a9\uff1acodemod \u5e2e\u52a9\u6211\u4eec\u5347\u7ea7
  • React \u6d4b\u8bd5\u5e93\u4e5f\u5fc5\u987b\u66f4\u65b0
  • React 18 \u5e26\u6765\u4e86\u91cd\u5927\u53d8\u5316

\u5176\u4ed6\u66f4\u591a\u7684\u4fe1\u606f\u53ef\u4ee5\u67e5\u770b\u6587\u7ae0\u5730\u5740\uff0c\u5176\u5b9e 18 \u5e26\u6765\u7684\u53d8\u5316\u8fd8\u662f\u5f88\u663e\u8457\u7684\uff0c\u6bd4\u5982 \u5168\u81ea\u52a8\u7684\u6279\u91cf\u66f4\u65b0\uff0c\u66f4\u4f18\u5f02\u7684\u4e2d\u65ad\u5f0f\u66f4\u65b0\u3002

"},{"location":"docs/2024/01/35/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/02/36/","title":"Scholar's Weekly \u7b2c36\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 shopify)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a Graph\u3001TypeScript\u3001Package manager\u3001CSS In JS

"},{"location":"docs/2024/02/36/#fe-news","title":"FE News","text":""},{"location":"docs/2024/02/36/#1cytoscapejs","title":"1.Cytoscape.js","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://js.cytoscape.org/#demos

\u7eafJS\u7f16\u5199\u7684\u529f\u80fd\u9f50\u5168\u7684\u56fe\u5e93\u3002

\u53ef\u4ee5\u7ed8\u5236\u4ee5\u4e0b demo \u7c7b\u56fe\u3002

"},{"location":"docs/2024/02/36/#2typescript-54-beta","title":"2.TypeScript 5.4 Beta \u6765\u4e34","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://devblogs.microsoft.com/typescript/announcing-typescript-5-4-beta/

  • \u5728\u6700\u540e\u7684\u8d4b\u503c\u4e4b\u540e\u4fdd\u7559\u95ed\u5305\u4e2d\u7684\u7f29\u5c0f\u8303\u56f4
  • NoInfer \u5b9e\u7528\u7c7b\u578b
  • Object.groupBy \u548c Map.groupBy
  • --moduleResolution bundler \u548c --module preserve \u4e2d\u5bf9 require() \u8c03\u7528\u7684\u652f\u6301
  • \u68c0\u67e5\u5bfc\u5165\u5c5e\u6027\u548c\u65ad\u8a00
  • \u6dfb\u52a0\u4e22\u5931\u53c2\u6570\u7684\u5feb\u901f\u4fee\u590d\u65b9\u6cd5
  • \u5373\u5c06\u5230\u6765\u7684 5.5 \u5f03\u7528\u529f\u80fd
  • \u91cd\u5927\u53d8\u66f4
"},{"location":"docs/2024/02/36/#3pnpm","title":"3.Pnpm \u4f5c\u8005\u505a\u4e86\u4e00\u4e2a\u65b0\u7684\u3001\u5f88\u53cb\u597d\u7684\u57fa\u51c6\u6d4b\u8bd5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://pnpm.io/benchmarks

\u5982\u4e0a\u56fe\uff0c\u770b\u8d77\u6765\u8fd8\u662f\u6bd4\u8f83\u4e2d\u80af\u7684\uff0c\u4e0b\u9762\u8fd9\u5f20\u56fe\u5c31\u66f4\u76f4\u89c2\u4e86\uff1a

yarn Pnp \u4e5f\u975e\u5e38\u663e\u773c\u4ee5\u53ca\u4f18\u5f02\uff5e

"},{"location":"docs/2024/02/36/#4nextjs-app-router-migration-the-good-bad-and-ugly","title":"4.NEXT.JS APP ROUTER MIGRATION: THE GOOD, BAD, AND UGLY","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.flightcontrol.dev/blog/nextjs-app-router-migration-the-good-bad-and-ugly

Next.js \u8fc1\u79fb App Router\uff0c\u4e00\u4e9b\u597d\u7684\u3001\u574f\u7684\u3001\u4e11\u964b\u7684\u75db\u70b9\u3002

\u4f5c\u8005\u7684\u516c\u53f8\u76f4\u63a5\u8fc1\u79fb\u5931\u8d25\uff0c\u6700\u7ec8\u505c\u7559\u5728 13.+ \u7248\u672c\uff0c\u76f4\u8a00\u66f4\u60f3\u9009\u62e9 Remix\u3002

\u8bf4\u5b9e\u8bdd\u6211\u4e5f\u4fdd\u7559\u770b\u6cd5\uff0c\u6211\u7684\u535a\u5ba2\u7cfb\u7edf\u4e5f\u6b63\u5728\u8fc1\u79fb\uff0c\u8fc1\u79fb\u8fc7\u7a0b\u6709\u4e9b\u6cae\u4e27\u3002

"},{"location":"docs/2024/02/36/#5","title":"5.\u73b0\u4ee3\u5316\u53d1\u5e03\u4e00\u4e2a\u5305\u7684\u5f00\u59cb","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://advancedweb.hu/modern-javascript-library-starter/

\u4f5c\u8005\u4ecb\u7ecd\u4e86\u4ece\u53d1\u5e03\u4e00\u4e2a\u5305\u5230 CI/CD \u7684\u6d41\u7a0b\uff0c\u4e2d\u7acb\u7684\u8bb2\u8fd8\u662f\u6bd4\u8f83\u57fa\u7840\u7684\uff0c\u5e0c\u671b\u5927\u5bb6\u6709\u6536\u83b7\u3002

"},{"location":"docs/2024/02/36/#6polished-43","title":"6.Polished 4.3","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://polished.js.org/docs/#installation

\u8fd9\u4e2a\u5e93\u662f\u8f85\u52a9\u7f16\u5199 css in js \u7684\u6837\u5f0f\u5e93\uff0c\u53ef\u80fd\u5927\u5bb6\u7b2c\u4e00\u6b21\u63a5\u89e6\uff0c\u5bb9\u6211\u5199\u51e0\u4e2a demo\u3002

// Styles as object usage\nconst styles = {\nfontSize: between('20px', '100px', '400px', '1000px'),\nfontSize: between('20px', '100px')\n}\n\n// styled-components usage\nconst div = styled.div`\n  fontSize: ${between('20px', '100px', '400px', '1000px')};\n  fontSize: ${between('20px', '100px')}\n`\n\n// CSS as JS Output\n\nh1: {\n'fontSize': 'calc(-33.33333333333334px + 13.333333333333334vw)',\n'fontSize': 'calc(-9.090909090909093px + 9.090909090909092vw)'\n}\n
"},{"location":"docs/2024/02/36/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"},{"location":"docs/2024/02/37/","title":"Scholar's Weekly \u7b2c37\u671f","text":"

(\u5c01\u9762\u56fe\u7247\u6765\u6e90\u4e8e\uff1a\u57fa\u4e8e CC0 \u534f\u8bae\u7684 shopify)

\u6e29\u99a8\u63d0\u793a

\u5468\u520a\u4e2d\u6240\u6709\u9ad8\u4eae\u7684\u5185\u5bb9\u90fd\u53ef\u4ee5\u70b9\u51fb\u5230\u6307\u5b9a\u5185\u5bb9\u7684\u94fe\u63a5\uff5e

\u5982\u679c\u60a8\u6b63\u5904\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\uff0c\u8bf7\u76f4\u63a5\u6eda\u52a8\u81f3\u5e95\u90e8\ud83d\udc49\u9605\u8bfb\u539f\u6587\ud83e\udef6

\u5173\u952e\u8bcd\uff1a Graph\u3001TypeScript\u3001Package manager\u3001CSS In JS

"},{"location":"docs/2024/02/37/#fe-news","title":"FE News","text":""},{"location":"docs/2024/02/37/#1tempo","title":"1.Tempo","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://tempo.formkit.com/#introduction

\u4e00\u4e2a\u53d7\u81ea\u591a\u4e2a\u65f6\u95f4\u5904\u7406\u5f00\u6e90\u5e93\u7075\u611f\u7684\u65b0\u7684\u65f6\u95f4\u5904\u7406\u5e93\uff0c\u5c3d\u53ef\u80fd\u7684\u5c0f\uff0c\u6bd4\u54b1\u4eec\u5df2\u77e5\u7684 dayjs\u8fd8\u5c0f\u4e14\u652f\u6301 tree-shaking\u3002

"},{"location":"docs/2024/02/37/#2gemini-15","title":"2.Gemini 1.5","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://blog.google/technology/ai/google-gemini-next-generation-model-february-2024/#sundar-note

Gemini 1.5 \u6765\u4e34\u4e86\uff0c\u6211\u5df2\u7ecf\u52a0\u5165\u5019\u8865\u4e86\uff0c\u5feb\u6765\u8bd5\u7528\u5427\u3002

\u6211\u4eec\u53ef\u4ee5\u6765\u770b\u770b Gemini 1.0 pro \u7684\u806a\u660e\u7a0b\u5ea6\uff0c\u867d\u7136\u8bdd\u6ca1\u90a3\u4e48\u591a\uff0c\u4f46\u662f\u5f3a\u4e8e GPT 3.5\u3002

"},{"location":"docs/2024/02/37/#3jsr","title":"3.JSR","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://jsr.io/waitlist

Deno \u56e2\u961f\u5373\u5c06\u63a8\u51fa\u7684\u65b0\u7684 \u5305\u7ba1\u7406\u5de5\u5177\u3002

\u4e0b\u9762\u662f Hack News \u7684\u8ba8\u8bba\uff1a

"},{"location":"docs/2024/02/37/#4hono-40","title":"4.Hono 4.0 \u6765\u4e34","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://hono.dev/

Hono 4.0 \u6765\u4e34\uff0c\u53f7\u79f0\u5168\u6808\uff0c\u6211\u4eec\u5148\u6d45\u770b\u4ee5\u4e0b SSG\u3002

"},{"location":"docs/2024/02/37/#5javascript","title":"5.JavaScript \u96c6\u5408\u4e2d\u5305\u542b\u5e76\u96c6\u3001\u4ea4\u96c6\u3001\u5dee\u96c6\u7b49","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://www.sonarsource.com/blog/union-intersection-difference-javascript-sets/

\u65b0\u7684\u63d0\u6848\u4e2d\u56ca\u62ec\u4e86\u8fd9\u4e9b\u65b9\u6cd5 union\u3001intersection\u3001difference\u3001symmetricDifference\u3001isSubsetOf\u3001isSupersetOf \u548c isDisjointFrom.

\u5e76\u96c6

const frontEndLanguages = new Set([\"JavaScript\", \"HTML\", \"CSS\"]);\n\nconst backEndLanguages = new Set([\"Python\", \"Java\", \"JavaScript\"]);\n\nconst allLanguages = frontEndLanguages.union(backEndLanguages);\n\n// => Set {\"JavaScript\", \"HTML\", \"CSS\", \"Python\", \"Java\"}\n
\u4ea4\u96c6

const frontEndLanguages = new Set([\"JavaScript\", \"HTML\", \"CSS\"]);\n\nconst backEndLanguages = new Set([\"Python\", \"Java\", \"JavaScript\"]);\n\nconst frontAndBackEnd = frontEndLanguages.intersection(backEndLanguages);\n\n// => Set {\"JavaScript\"} \n

\u5355\u4e00\u5bf9\u6bd4\u76f8\u4ea4\u5dee\u5f02

const frontEndLanguages = new Set([\"JavaScript\", \"HTML\", \"CSS\"]);\n\nconst backEndLanguages = new Set([\"Python\", \"Java\", \"JavaScript\"]);\n\nconst onlyFrontEnd = frontEndLanguages.difference(backEndLanguages);\n\n// => Set {\"HTML\", \"CSS\"} \n\nconst onlyBackEnd = backEndLanguages.difference(frontEndLanguages);\n\n// => Set {\"Python\", \"Java\"}\n

\u5168\u5bf9\u6bd4\u76f8\u4ea4\u5dee\u5f02

const frontEndLanguages = new Set([\"JavaScript\", \"HTML\", \"CSS\"]);\n\nconst backEndLanguages = new Set([\"Python\", \"Java\", \"JavaScript\"]);\n\nconst onlyFrontEnd = frontEndLanguages.symmetricDifference(backEndLanguages);\n\n// => Set {\"HTML\", \"CSS\", \"Python\", \"Java\"} \n\nconst onlyBackEnd = backEndLanguages.symmetricDifference(frontEndLanguages);\n\n// => Set {\"Python\", \"Java\", \"HTML\", \"CSS\"}\n

\u662f\u5426\u5b50\u96c6

const frontEndLanguages = new Set([\"JavaScript\", \"HTML\", \"CSS\"]);\n\nconst declarativeLanguages = new Set([\"HTML\", \"CSS\"]);\n\ndeclarativeLanguages.isSubsetOf(frontEndLanguages);\n\n// => true\n\nfrontEndLanguages.isSubsetOf(declarativeLanguages);\n\n// => false\n
"},{"location":"docs/2024/02/37/#6-arrayprototypewith","title":"6.\u4f7f\u7528 Array.prototype.with \u66f4\u65b0\u4e0d\u53ef\u53d8\u6570\u7ec4","text":"

\u76f8\u5173\u5730\u5740\uff1ahttps://web.dev/blog/array-with?hl=zh-cn

Array.prototype.with(index, value)\u65b9\u6cd5\u4f1a\u8fd4\u56de\u5bf9\u5176\u8c03\u7528\u7684\u6570\u7ec4\u7684\u526f\u672c\uff0c\u5e76\u5c06 index \u8bbe\u7f6e\u4e3a\u60a8\u63d0\u4f9b\u7684\u65b0 value\u3002

\u4ee5\u4e0b\u793a\u4f8b\u663e\u793a\u4e86\u4e00\u4e2a\u5e74\u9f84\u6570\u7ec4\u3002\u60a8\u60f3\u8981\u521b\u5efa\u65b0\u7684\u6570\u7ec4\u526f\u672c\uff0c\u540c\u65f6\u5c06\u7b2c\u4e8c\u4e2a\u5e74\u9f84\u4ece 15 \u66f4\u6539\u4e3a 16\uff1a

const ages = [10, 15, 20, 25];\n\nconst newAges = ages.with(1, 16);\nconsole.log(newAges); // [10, 16, 20, 25]\nconsole.log(ages); // [10, 15, 20, 25] (unchanged)\n

"},{"location":"docs/2024/02/37/#7-so-you-think-you-know-git","title":"7.[ So You Think You Know Git... ]","text":"

Scott Chacon \u751f\u52a8\u7684\u5373\u5174\u6f14\u8bb2\ud83c\udfa4\u3002

"},{"location":"docs/2024/02/37/#end","title":"End","text":"

\u4ea4\u4e2a\u670b\u53cb\u5427\uff5e

\u6211\u662f\u4e0d\u6362(\u4e66\u751f)\uff0c\"\u6d6a\u5b50\u56de\u5934\u91d1\u4e0d\u6362\"\u7684\u4e0d\u6362\uff0c\"\u767e\u65e0\u4e00\u7528\u662f\u4e66\u751f\"\u7684\u4e66\u751f\uff0c\u70ed\u7231\u5de5\u4f5c\uff0c\u540c\u65f6\u5728\u5de5\u4f5c\u4e4b\u4f59\u4e5f\u70ed\u7231\u5f00\u6e90\u3002

\u672c\u671f\u5468\u520a\u5230\u8fd9\u91cc\u5c31\u7ed3\u675f\u4e86\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\ud83d\udc4b\uff5e

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..3c050ca --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,203 @@ + + + + https://weekly.binlin.wang/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/DECLARATION/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/LANDMARK/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/07/01/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/07/02/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/08/03/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/08/04/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/08/05/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/08/06/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/09/07/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2022/10/08/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/02/09/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/02/10/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/02/11/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/02/12/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/03/13/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/03/14/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/03/15/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/03/16/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/04/17/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/04/18/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/04/19/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/05/20/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/05/21/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/05/22/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/05/23/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/06/24/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/06/25/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/06/26/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/06/27/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/07/28/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/08/29/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2023/09/30/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/01/31/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/01/32/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/01/33/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/01/34/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/01/35/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/02/36/ + 2024-02-18 + daily + + + https://weekly.binlin.wang/docs/2024/02/37/ + 2024-02-18 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..f8c2860d6e823cd9edf081a7f93cbcd5c3850a74 GIT binary patch literal 395 zcmV;60d)Q!iwFo5`q5t_2egI>Ju@I+; zan59!4}efNA}f=kxVN|67PDJ#%sIU&G>6k)n!rCHoqz8e?@M*2ZuQLP0rNej%eJcZ zcILlq?#GEg&qnEI*BI4%wpg2)zw7(M4ZtuAfvJ17FAgSXyDgY= zxCZB|(@2}P%v=}a+9>tj9D~qnHhsx1xJ{ROZIFiyZI zup1L#l7KNJV2lVDW9-JMdu?zVIdeye*(lwI#~vkmqdiLeMoz#eup1?CNx&EqFh&H7 zF?M4Jd_usO5HO<8naIurjGTZ`5HO<8nHWS!z!(uQ#srM$b7lepea<8x(C5q)B<`FE p-A^;g2^a+dqa