整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Web 程序員為什么要遵循 HTML 優先原則?

          者通過實踐來闡述HTML 優先原則的主要目標是擴大能夠從事 Web 軟件編程工作的人員范圍。

          原文鏈接:https://html-first.com/

          未經允許,禁止轉載!


          作者 | Tony Ennis 譯者 | 彎月
          責編 | 夏萌
          出品 | CSDN(ID:CSDNnews)

          HTML優先是一組原則,旨在通過以下方式使構建 Web 軟件更容易、更快、更具包容性且更易于維護:

          1. 利用現代網絡瀏覽器的默認功能。

          2. 利用 HTML 屬性語法的極致簡單性。

          3. 利用 Web 的查看源代碼功能。

          目標

          HTML優先原則的主要目標是擴大能夠從事 Web 軟件編程工作的人員范圍。從個人角度來看,這是件好事,因為這可以讓更多的人成為Web 程序員,構建出色的 Web 軟件,并提高他們的收入。從業務角度來看,這些原則也有好處,因為這可以降低構建軟件的成本,并減少招聘所需的資源量(眾所周知,這是一個資源密集型流程)。

          HTML優先原則的第二大目標是讓構建 Web 軟件的工作變得更加愉快和無縫。對于大多數 Web 程序員來說,在快速構建產品期間能夠流暢地在文本編輯器和瀏覽器之間來回切換,而不會遇到各種磕磕絆絆,也不需要切換上下文,他們會感到非常興奮。但如今程序員需要幾年的時間來掌握工具和框架才能達到這個階段。HTML 優先原則能夠讓人們在學習編程的早期階段體會這種感覺,并達到這種水平。

          為了實現這些目標,首先必須承認 HTML 非常容易理解,因此我們將 HTML 作為產品的基石,不僅用 HTML 來定義內容和結構,還用它來設置樣式和行為。

          原則

          1. 推薦使用 HTML 原生的方法。

          2. 使用 HTML 屬性來設置樣式和行為。

          3. 使用利用了 HTML屬性的庫。

          4. 避開構建過程。

          5. 推薦使用“裸” HTML。

          6. 保留查看源代碼的功能。

          1.使用 HTML 原有的方法通過外部框架實現所需的功能

          瀏覽器支持的開箱即用的功能范圍很廣,而且數量還在不斷增長。在將庫或框架添加到代碼庫之前,請檢查是否可以使用原汁原味的 html/css 來實現它。

          鼓勵的寫法:

          不鼓勵的寫法:

          2.如有可能,默認使用內聯 HTML 屬性定義樣式和行為

          我們可以使用 Tailwind 或 Tachyons等 SPC 庫來實現樣式。同時使用 hyperscript、Alpine 或類似的庫來實現行為。這意味著很多功能都需要使用 HTML 來實現。但這也意味著其他開發人員更容易找到和理解行為、瀏覽并修改它們。

          鼓勵的寫法:

          不鼓勵的寫法:

          你可能會注意到,這種方法似乎違反了關注點分離——備受吹捧的軟件設計原則之一。我們認為,非黑即白的關注點分離原則是有缺陷的,因此我們提倡采用一種考慮到行為局部性以及兩者之間權衡的方法。

          3.如果需要庫,請使用利用 html 屬性的庫,不推薦使用圍繞 JavaScript 或自定義語法構建的庫

          鼓勵的寫法:

          不鼓勵的寫法:

          4.避開構建過程

          需要將文件從一種格式轉換為另一種格式的庫會導致維護開銷增加大量,嚴重影響查看源代碼的功能或導致其無法使用,而且通常開發人員需要學習新工具才能使用它們。現代瀏覽器已不再有當初引入這些實踐時的性能限制。如果我們使用 HTML 優先的庫(例如 static tailwind 或 htmx),則額外所需的 CSS 和JS 量為最少。

          鼓勵的寫法:

          不鼓勵的寫法:

          5.推薦使用“裸” HTML,不推薦編譯為 HTML的各個混亂層

          這條原則適用于后端實現。基本思想是可讀性。熟悉 HTML 但不熟悉后端框架的開發人員查看視圖文件,仍然應該能夠理解 90% 以上的內容。如上所述,這意味著犧牲簡潔性而換取易于理解性。

          鼓勵的寫法:

          不鼓勵的寫法:

          6.如有可能,保留右鍵單擊查看源代碼的功能

          早期網絡的美妙之處在于,我們總能 "窺探 "到網頁任何部分的代碼。對于有抱負的開發人員來說,這是一項福利,因為這為我們在理論(閱讀代碼如何工作)和實踐之間架起了一座橋梁,將代碼和界面并排展示在我們眼前。對于許多網站來說,我們只需復制并粘貼 html 或 css,然后放到自己的網站上運行,就可以獲得近乎相同的復制品。新舊代碼的混合不僅是一種學習方式,而且往往也是我們創作新作品的基礎。

          后來,業界采用了一些 "改進 "方法,導致這種做法變得更為罕見。例如,如果我們使用流行的前端框架 React,就不能點擊 "查看源代碼",復制代碼并重新混合,因為首先 React 有構建過程,這意味著我們在開發人員工具中看到的代碼與開發人員編寫的代碼不同;其次,React 代碼片段必須封裝在 react 應用程序中才能工作。

          遵循 HTML 優先原則的網站能夠重新獲得查看源代碼的功能。事實上,HTML 優先的網站往往更進一步。因為如果使用 HTML 屬性定義用戶界面交互,那么在復制粘貼到新的代碼庫時,也可以保留這些交互(前提是目標文件包含相同的 js 庫)。我們打算將來將其擴展到 HTML 優先的代碼片段庫。

          總結

          本文中描述的實踐和原則在整個行業中仍然很小眾,而且使用的社區也很少。我希望通過建設網站(https://html-first.com/)的方式來尋找同道合的人,共同探討并完善這些想法。

          個是我用htmlcssrScrip寫出來的東西,它包括兩個部分,一個是上面的轉盤,一個是下面的計時器。

          ·點擊spin旋轉,它就轉,stop停止,停止以后就會反饋,就是獲得了什么,學習兩個小時。獲得這個以后就可以start timer,開始學習。

          ·這個是重置,重置timer,計時器。如果學完了兩個小時再轉一次,轉完以后又是學習兩個小時,再開計時器,學完又重置一遍,再轉一下,學習30分鐘,再去學30分鐘,再開,再關。

          這么一個東西要怎么做?等一下我教你們怎么做。

          ·首先先在桌面新建一個文本文檔,給它命名成learning,learning,will,叫什么?學習的轉盤,帶有WIS,WIS什么timer,計時timer,計時器。

          ·把它的后綴改一下,改成html覆蓋,保存。

          ·保存完了以后用vs code打開,打開完以后就是一個空白的頁面。

          ·接下來敲代碼的時間,寫一個前端代碼,實現剛剛那個小東西。

          ·首先把框架給卸了,然后是Id doctyper,html,這個好像是瀏覽器之類的問題的,管它HML后,這是language的縮寫,它就等于English的縮寫。

          ·下面是made,chaset,這是設置一個字符編碼的UTF-8,name,這是一個4口屬性。

          ·內容是content,content的寬度是等于設備的寬度。

          ·它的initial SCA,SCA就是它的初始規模,是等于1.0,就是跟網頁的大小是一樣的。

          ·接下來是一個title,就是標題,標題就是learning,learning,will學習的,轉盤帶有time,就是帶有計時器的一個學習的轉盤。

          ·下面是CS的內容,就是style樣式,這是CSS的內容。

          ·接下來就是到波底,接下來就是body的內容,body,head還沒結束是吧?不對,我的head去哪了?問題好大,這里有一個head,我是覺得是先寫大皇家是比較好的,就是the head。

          ·head里面包括幾個部分,就是title,標題還有style,就是CSS,body,body里面,波波底下面是h,是HGL結束了。

          ·body里面包含兩個東西,兩個div就是兩個塊,這塊一個是用來做抽獎的轉盤的,一個是用來做timer,就是計時器。

          ·記下來是叫script東西,就是script,screw script。

          ·這就是整個的框架,就是這里是CSS的地方,這里是title,它的標題就是網頁上它給出的標題,就是地址欄那里的標題。

          ·這里是兩個div,就是兩個塊,到時候就是用兩個容器來裝抽獎的轉盤和計時器。

          ·這里是加入script的代碼。

          大概就講到這里。

          家好,很高興又見面了,我是"高級前端?進階?",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發,您的支持是我不斷創作的動力。

          什么是 Chrono (v2)

          Chrono 是 Javascript 中的自然語言日期解析器,它旨在處理大多數日期/時間格式并從任何給定文本中提取信息,內容包括:

          • 今天、明天、昨天、上周五等
          • 2013 年 8 月 17 日 - 2013 年 8 月 19 日
          • 本周五 13:00 - 16:00
          • 5 天前
          • 2 周后
          • 2013 年 8 月 17 日星期六 18:40:39 GMT+0900 (JST)
          • 2014-11-30T08:15:30-05:30

          目前 Chrono 在 Github 上通過 MIT 協議開源,有超過 3.5k 的 star,值得嘗試。

          如何使用 Chrono (v2)

          基礎使用

          首先需要通過 NPM 安裝:

          npm install --save chrono-node

          然后直接在代碼中引入即可:

          import * as chrono from 'chrono-node';
          
          chrono.parseDate('An appointment on Sep 12-13');

          如果是 Node.js 環境,可以使用下面的代碼:

          const chrono = require('chrono-node');
          
          // or `import chrono from 'chrono-node'` for ECMAScript

          對于 Chrono 庫來說,只需將字符串傳遞給函數 chrono.parseDate 或 chrono.parse 即可。

          import * as chrono from 'chrono-node';
          
          chrono.parseDate('An appointment on Sep 12-13');
          // Fri Sep 12 2014 12:00:00 GMT-0500 (CDT)
          
          chrono.parse('An appointment on Sep 12-13');
          /* [{ 
              index: 18,
              text: 'Sep 12-13',
              start: ...
          }] */

          解析參考(日期/時區)

          今天的“星期五”與上個月的“星期五”不同,引用日期的含義取決于它們被提及的時間和地點。 Chrono 允許開發者將引用定義為 Date 或 ParsingReference 對象:

          // (Note: the exmaples run on JST timezone)
          chrono.parseDate('Friday', new Date(2012, 8 - 1, 23));
          // Fri Aug 24 2012 12:00:00 GMT+0900 (JST)
          
          chrono.parseDate('Friday', new Date(2012, 8 - 1, 1));
          // Fri Aug 03 2012 12:00:00 GMT+0900 (JST)
          
          chrono.parseDate('Friday at 4pm', {
            // Wed Jun 09 2021 21:00:00 GMT+0900 (JST)
            // = Wed Jun 09 2021 07:00:00 GMT-0500 (CDT)
            instant: new Date(1623240000000),
            timezone: 'CDT',
          });
          // Sat Jun 12 2021 06:00:00 GMT+0900 (JST)
          // = Fri Jun 11 2021 16:00:00 GMT-0500 (CDT)

          解析配置

          forwardDate(布爾值)假設結果應該在參考日期之后發生。

          const referenceDate = new Date(2012, 7, 25);
          // Sat Aug 25 2012 00:00:00 GMT+0900 -- The reference date was Saturday
          
          chrono.parseDate('Friday', referenceDate);
          // Fri Aug 24 2012 12:00:00 GMT+0900 (JST) -- The day before was Friday
          
          chrono.parseDate('Friday', referenceDate, { forwardDate: true });
          // Fri Aug 31 2012 12:00:00 GMT+0900 (JST) -- The following Friday

          timezones 覆蓋或添加時區縮寫和偏移量之間的自定義映射。 當希望 Chrono 將某些文本解析為給定的時區偏移量時,請使用此選項。 Chrono 支持明確的(正常)時區映射和模糊映射,其中夏令時期間和之外的偏移量不同。

          // Chrono doesn't understand XYZ, so no timezone is parsed
          chrono.parse('at 10:00 XYZ', new Date(2023, 3, 20))
          // "knownValues": {"hour": 10, "minute": 0}
          
          // Make Chrono parse XYZ as offset GMT-0300 (180 minutes)
          chrono.parse('at 10:00 XYZ', new Date(2023, 3, 20), { timezones: { XYZ: -180 } })
          // "knownValues": {"hour": 10, "minute": 0, "timezoneOffset": -180}
          
          // Make Chrono parse XYZ as offset GMT-0300 outside of DST, and GMT-0200 during DST. Assume DST is between 
          import { getLastDayOfMonthTransition } from "timezone";
          import { Weekday, Month } from "parsing";
          
          const parseXYZAsAmbiguousTz = {
            timezoneOffsetDuringDst: -120,
            timezoneOffsetNonDst: -180,
            dstStart: (year: number) => getLastWeekdayOfMonth(year, Month.FEBRUARY, Weekday.SUNDAY, 2),
            dstEnd: (year: number) => getLastWeekdayOfMonth(year, Month.SEPTEMBER, Weekday.SUNDAY, 3)
          };
          // Parsing a date which falls within DST
          chrono.parse('Jan 1st 2023 at 10:00 XYZ', new Date(2023, 3, 20), { timezones: { XYZ: parseXYZAsAmbiguousTz } })
          // "knownValues": {"month": 1, ..., "timezoneOffset": -180}
          
          // Parsing a non-DST date
          chrono.parse('Jun 1st 2023 at 10:00 XYZ', new Date(2023, 3, 20), { timezones: { XYZ: parseXYZAsAmbiguousTz } })
          // "knownValues": {"month": 6, ..., "timezoneOffset": -120}

          參考資料

          https://github.com/wanasit/chrono

          https://dexlock.com/blog/a-dive-into-nlp-date-parsers/


          主站蜘蛛池模板: 中文字幕无码不卡一区二区三区 | 精品一区二区久久久久久久网精| 久久精品黄AA片一区二区三区| 精品国产高清自在线一区二区三区| 91麻豆精品国产自产在线观看一区| 亚洲欧美日韩国产精品一区| 久久久久人妻精品一区| 国产一区二区三精品久久久无广告| 爆乳无码AV一区二区三区 | 日韩精品一区二区三区中文| 无码人妻一区二区三区精品视频| 欧美av色香蕉一区二区蜜桃小说| 免费无码一区二区三区| 亚洲AV无码一区二区三区系列| 国产色情一区二区三区在线播放| 日本一区二区三区在线网 | 卡通动漫中文字幕第一区| 伊人色综合网一区二区三区 | 一区二区免费在线观看| 国产在线精品一区二区在线看| 无码国产精品一区二区免费式影视 | 亚洲一区二区中文| 久久亚洲国产精品一区二区| 中文字幕亚洲一区二区三区| 国产一区二区四区在线观看| 中文字幕在线无码一区| 久久精品亚洲一区二区| 日本免费一区二区三区四区五六区| 无码精品一区二区三区免费视频| 久久久综合亚洲色一区二区三区| 国产精品美女一区二区视频| 日本一区二区在线播放| 亚洲av成人一区二区三区在线播放| 亚洲高清毛片一区二区| 国产成人无码精品一区不卡| 丰满岳妇乱一区二区三区| 中文字幕永久一区二区三区在线观看| 久久精品一区二区| 亚洲AV日韩综合一区尤物| 国产成人高清亚洲一区91| 国产激情一区二区三区 |