成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

now.js 0.1.0 發(fā)布了

philadelphia / 3420人閱讀

摘要:顯然這是最蠢也是工作量最大的方法。上發(fā)現(xiàn)了和,支持國際化。況且我寫庫的主要目的是為了學(xué)習(xí)。在的時候如果不合法就直接拋出錯誤,以免后續(xù)沒玩沒了的檢測。當然這可能損失了用戶友好性,但是對減少代碼量是很有幫助的。

now.js是什么

now.js是一個javascript的時間操作小工具,類似date-fns和moment。

長啥樣

簡單的把示例放這,更多用法請到github去發(fā)現(xiàn)。

import Now from "now.js"; // for node(browser do not need this)

now = new Now()

now.format() // "2017-11-20T22:23:00+08:00"
now.format("YYYY-MM-DD HH:mm:ss.SSS") // "2017-11-20 22:23:00.285"
now.format("ffffdd, MMMM Do YYYY, h:mm:ss a") // "Monday, November 20th 2017, 10:23:00 pm"

now.locale("zh-cn") // support 118 languages
now.format("ffffdd, MMMM Do YYYY, h:mm:ss a") // "星期一, 十一月 20日 2017, 10:23:00 晚上"
now.elapse() // "10 天前"
// same as
now.timeAgo() // "10 天前"

// monday
now.monday() // "2017-11-20 00:00:00"

// isMonday
now.isMonday() // true

// isBefore
now.isBefore(new Date(2020, 10, 11)) // true

// isLeapYear
now.isLeapYear() // false
now.isLeapYear(2008) // true

// between
now.between(new Date(2008, 10, 10), new Date(2018, 10, 10)) // true

// UTC
now.UTC().format() // "2017-11-20T22:23:00+00:00"

now.beginningOfMinute()   // "2017-11-20 22:23:00"
now.beginningOfHour()     // "2017-11-20 22:00:00"
now.beginningOfDay()      // "2017-11-20 00:00:00"
now.beginningOfWeek()     // "2017-11-19 00:00:00"
now.firstDayMonday = true // Set Monday as first day, default is Sunday
now.beginningOfWeek()     // "2017-11-20 00:00:00"
now.beginningOfMonth()    // "2017-11-01 00:00:00"
now.beginningOfQuarter()  // "2017-10-01 00:00:00"
now.beginningOfYear()     // "2017-01-01 00:00:00"

now.endOfMinute()         // "2017-11-20 22:23:59.999"
now.endOfHour()           // "2017-11-20 22:59:59.999"
now.endOfDay()            // "2017-11-20 23:59:59.999"
now.endOfWeek()           // "2017-11-25 23:59:59.999"
now.firstDayMonday = true // Set Monday as first day, default is Sunday
now.endOfWeek()           // "2017-11-26 23:59:59.999"
now.endOfMonth()          // "2017-11-30 23:59:59.999"
now.endOfQuarter()        // "2017-12-31 23:59:59.999"
now.endOfYear()           // "2017-12-31 23:59:59.999"

All the above functions return String type. You can pass "self" to return Now instance:

var beginningOfMinute = now.beginningOfMinute("self") // return Now instance
beginningOfMinute.format("ffffd, Ah") // "Mon, PM10"
beginningOfMinute.format("LLLL") // "Monday, November 20, 2017 10:23 PM"
beginningOfMinute.isMonday() // true
為什么要寫這個庫

因為學(xué)習(xí)underscore源碼的過程中,感覺無聊。想寫個庫調(diào)劑一下,當做學(xué)習(xí)的機會。

我是照著underscore源碼一個個commit敲的.代碼放在這里,剛看了一眼,有668次commit,兩個月,敲到了1.4.3版本,可能還沒到一半。

敲久了有點無聊。想動手寫一個庫作為調(diào)劑。碰巧之前做防健忘短信提醒的時候是用go寫的后臺,用了gorm,在作者jinzhu的github主頁上發(fā)現(xiàn)了now,是一個go的時間幫助庫,覺得很有意思。clone之,學(xué)之。

偷了now的思想。造一個javascript版的就顯得很容易。很快我就寫完了除了Parse MustParse 之外的所有方法。跟原庫對比一下。覺得now.js就是個玩具。這不怪我,javascript對時間處理的支持遠不如go。比如go原生支持format、字符串解析成時間以及Duration等等。

想著加上format。該怎么去寫?立馬就想到的方法是平時經(jīng)常寫的根據(jù)不同條件做字符串拼接。確實是個方法。但得多少switch case才能涵蓋所有情況,想想都可怕。顯然這是最蠢也是工作量最大的方法。

不會,那就借鑒別人的。github上發(fā)現(xiàn)了date-fns和moment,支持i18n國際化。

date-fns:

import { formatRelative } from "date-fns"
import { es, ru } from "date-fns/esm/locale"

formatRelative(subDays(new Date(), 3), new Date(), { locale: es })
//=> "el viernes pasado a las 19:26"

formatRelative(subDays(new Date(), 3), new Date(), { locale: ru })
//=> "в прошлую пятницу в 19:26"

moment:

moment.locale("fr");
moment(1316116057189).fromNow(); // il y a une heure
moment.locale("en");
moment(1316116057189).fromNow(); // an hour ago

我的審美告訴我應(yīng)該選擇moment,調(diào)用一次locale(),這之后的format都是基于該locale的。當然它也還支持每次多帶帶指定locale的:

moment.duration(1, "minutes").locale("en").humanize(); // a minute
moment.duration(1, "minutes").locale("fr").humanize(); // une minute
moment.duration(1, "minutes").locale("es").humanize(); // un minuto

進一步學(xué)習(xí)發(fā)現(xiàn)moment的format和i18n國際化高度耦合。要用它的i18n意味著基本上也得用它的format。當然i18n也不是核心的moment庫作者寫的,他們也精通不了那么多國家的語言,那都是github上許許多多人貢獻的。開源就有這好處??聪翷ICENCE是MIT的,代碼可用,抄。

now.js也是MIT協(xié)議的,負罪感少了點(其實MIT協(xié)議是相當寬松的,就算你拿它代碼去商業(yè)化也是沒有問題的)。況且我寫庫的主要目的是為了學(xué)習(xí)。

開干!雖說是抄,畢竟代碼要整合到我的庫,直接復(fù)制粘貼是不行的。所有的代碼細節(jié)未必都需要全知道,但看懂整體運行的邏輯是必須的,下點功夫,整合成功,開源。

思維腦圖

moment:

當然,moment的東西不止上圖這些,我只取了一部分來畫。


now.js:

now.js的Duration和moment的不一樣,現(xiàn)在還不支持多帶帶使用,只是給內(nèi)部方法elapse使用,以后可能會支持多帶帶使用。

對比

moment是大而全,now.js是剛夠用。

moment的parse相當強大,now.js就暫時不支持了,只支持和new Date(args)相同的args參數(shù)類型。不過format應(yīng)該都基本上和moment的一樣,不過測試用例現(xiàn)在還沒有寫太全,如果誰用了并且發(fā)現(xiàn)bug,可以到github去提issues。不勝感激。

moment是頁面一加載的時候會把所有的i18n都初始化了,這點我個人認為不好,加載時間長,網(wǎng)絡(luò)情況不好的時候,差不多需要10秒我才能在devtool上調(diào)試(當然這也包括官網(wǎng)加載的其他很多東西)。now.js只加載默認的,需要的時候按需加載。

moment做什么操作前都要檢測一下date是否合法的(isvalid)。now.js在parse的時候如果不合法就直接拋出錯誤,以免后續(xù)沒玩沒了的檢測。當然這可能損失了用戶友好性,但是對減少代碼量是很有幫助的。

結(jié)語

這個庫不是我一個人寫的,是許多開源工作者共同完成的。感謝moment的所有開源貢獻者,我從中學(xué)習(xí)了很多東西。后續(xù)還會繼續(xù)研究moment的代碼細節(jié),偷偷它的思想。


寫代碼什么最重要?思想最重要!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90178.html

相關(guān)文章

  • now.js 迷你版發(fā)布

    摘要:迷你版迷你版即版。版沒加新功能,只增加內(nèi)容和修正上的一些錯誤。這個版本國際化默認只支持英文和中文。如果想支持全部種語言,需要引入或者壓縮版。版本大小比較月月月月可以看出,比小,降低。完全可以放心在生產(chǎn)環(huán)境中使用而不擔心加載速度問題。 迷你版 迷你版即0.3.0版。0.2.0版沒加新功能,只增加eadme內(nèi)容和修正package.json上的一些錯誤。0.3.0同樣沒加新功能,但是卻是非...

    Caizhenhao 評論0 收藏0
  • iKcamp|基于Koa2搭建Node.js實戰(zhàn)(含視頻)? 記錄日志

    滬江CCtalk視頻地址:https://www.cctalk.com/v/15114923883523 showImg(https://segmentfault.com/img/remote/1460000012932474?w=1606&h=968); log 日志中間件 最困難的事情就是認識自己。 在一個真實的項目中,開發(fā)只是整個投入的一小部分,版本迭代和后期維護占了極其重要的部分。項目上線...

    stefan 評論0 收藏0
  • 讓工作與音樂(Vue)相伴

    摘要:前言最近在自學(xué)打算自己仿一個項目來實戰(zhàn)一下,由于本人很喜歡聽歌,所以就選擇了網(wǎng)易云音樂,在這與大家分享一下自己所遇到的問題,其中也有些不足之處也希望大家提一些寶貴的意見,互相學(xué)習(xí),一起進步。 showImg(https://segmentfault.com/img/remote/1460000015805758); 前言 最近在自學(xué)vue,打算自己仿一個項目來實戰(zhàn)一下,由于本人很喜歡聽...

    jemygraw 評論0 收藏0
  • JavaScript EventEmitter

    摘要:事件刪除可有可無。創(chuàng)建了一個類,然后在構(gòu)造函數(shù)里初始化一個類的屬性,這個屬性不需要要繼承任何東西,所以用了。但這不是必要的,因為實例化一個都會調(diào)用構(gòu)造函數(shù),皆為初始狀態(tài),應(yīng)該是不可能已經(jīng)定義了的,可去掉。成功執(zhí)行結(jié)束后返回。 GitHub地址:JavaScript EventEmitter博客地址:JavaScript EventEmitter 水平有限,歡迎批評指正 2個多月前把 ...

    lovXin 評論0 收藏0
  • 如何設(shè)計npm包的開發(fā)和發(fā)布流程

    摘要:所以此版本號在這里的作用并不是用來區(qū)分版本的,小版本號才是真正用來做版本區(qū)分的,那么在引用這個就要這么來控制版本號,舉個栗子鎖定大版本號和小版本號,不管我們開發(fā)過程中提交了多少次,我們引用都是最新的。 最近在把公司內(nèi)部用的一個庫發(fā)布到內(nèi)網(wǎng)的npm私服上,僅僅是發(fā)布的話是比較簡單的,但這個庫是由多個人一起維護的,而且npm私服只有一套,所以生產(chǎn)環(huán)境和開發(fā)環(huán)境,用的是同一個,那么,我們的需...

    qieangel2013 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<