ã¿ãªãããããã«ã¡ã¯ãææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã®å¯èœæ§ã«ã€ããŠã®ç§ã®èãã®çµæãå ±æããããšæããŸãã äŸãšããŠãã³ããã¯çšã®æ²ç€ºæ¿ã®èšèšãæ€èšããŠãã ããã ããæå³ã§ã¯ãåé¡ã®è£œåã¯ããªã¿ã¯ãšã·ã³ããµã€ã¶ãŒã®èŽè¡åãã«èšèšãããŠãããã€ã³ã¿ãŒãã§ã€ã¹ã§èªç±ã瀺ãããšãã§ããŸãã ããã©ããããæè¡ã³ã³ããŒãã³ãã§ã¯ã现éšãžã®æ³šæãå¿ èŠã§ãã
å®éã挫ç»ã§ã¯äœãããããŸããããããªãŒããŒã±ãããç¹ã«ãŒãã§äººæ°ã®ãã£ããã©ãŒã©ã 圢åŒã¯å€§å¥œãã§ãã ãããã£ãŠã次ã®çµè«ãæµããä»®å®ïŒãããã誀ãïŒã¯1ã€ã«ãããŸãããã¢ããªã±ãŒã·ã§ã³ãšã®å¯Ÿè©±ã®äž»ãªã¿ã€ãã¯è¡šç€ºã§ããã2çªç®ã®ã¿ã€ãã¯ã¢ããŠã³ã¹ãšãã£ã¹ã«ãã·ã§ã³ã®æçš¿ã§ãã
ç§ãã¡ã®ç®æšã¯ãã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ãäœæããããšã§ãã æè¡çããŠã㊠ãã ããçŸä»£ã®çŸå®ãšäžèŽããäœåãªãã€ãã¹ã«ã ç§ãéæãããäž»ãªèŠä»¶ã¯æ¬¡ã®ãšããã§ãã
ãµãŒããŒåŽïŒ
aïŒã¯ã©ã€ã¢ã³ããžã®ãŠãŒã¶ãŒããŒã¿ã®ä¿åãæ€èšŒãéä¿¡ã®æ©èœãå®è¡ãã
bïŒäžèšã®æäœã¯ã蚱容éã®ãªãœãŒã¹ïŒæéãå«ãïŒãæ¶è²»ããŸã
cïŒã¢ããªã±ãŒã·ã§ã³ãšããŒã¿ãäžè¬çãªæ»æãã¯ãã«ããä¿è·ãããŠãã
dïŒãµãŒãããŒãã£ã®ã¯ã©ã€ã¢ã³ããšãµãŒããŒé察話ã®ããã®ã·ã³ãã«ãªAPI
eïŒã¯ãã¹ãã©ãããã©ãŒã ã§ç°¡åãªå±é
ã¯ã©ã€ã¢ã³ãåŽïŒ
aïŒã³ã³ãã³ãã®äœæãšäœ¿çšã«å¿ èŠãªæ©èœãæäŸããŸã
bïŒã€ã³ã¿ãŒãã§ã€ã¹ã¯ãéåžžã®äœ¿çšãã¢ã¯ã·ã§ã³ãžã®æå°ãã¹ãç»é¢ããšã®æ倧ããŒã¿éã«äŸ¿å©ã§ãã
cïŒãµãŒããŒãšã®éä¿¡å€ã§ããã®ç¶æ³ã§ãã¹ãŠã®å¯èœãªæ©èœãå©çšå¯èœ
dïŒã€ã³ã¿ãŒãã§ã€ã¹ã¯ãåèµ·åããŠåŸ æ©ããããšãªããç¶æ ãšã³ã³ãã³ãã®çŸåšã®ããŒãžã§ã³ã衚瀺ããŸã
dïŒã¢ããªã±ãŒã·ã§ã³ãåèµ·åããŠãããã®ç¶æ ã«ã¯åœ±é¿ããŸãã
fïŒå¯èœã§ããã°ãDOMèŠçŽ ãšJSã³ãŒããåå©çšããŸã
gïŒå®è¡æã«ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãã
hïŒã¬ã€ã¢ãŠãã¯ãã¢ã¯ã»ã·ããªãã£ãããŒãµãŒãªã©ã®ã»ãã³ãã£ãã¯ã§ãã
iïŒã¡ã€ã³ã³ã³ãã³ãã®ããã²ãŒã·ã§ã³ã«ã¯ãURLãšããŒããŒãã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸã
ç§ã®æèŠã§ã¯ãè«ççãªèŠä»¶ãããã³ææ°ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãããçšåºŠãããã®æ¡ä»¶ãæºãããŠããŸãã ç§ãã¡ã«äœãèµ·ãããèŠãŠã¿ãŸãããïŒæçš¿ã®æåŸã«ãããœãŒã¹ãšãã¢ãžã®ãªã³ã¯ïŒã
- èš±å¯ãªããã¢ã§äœ¿çšãããç»åã®äžæãªäœè ããªãã³ã«GösseG.ãProzorovskaya B. D.ãããã³åºç瀟ããã£ã¬ã³ãã§å³æžé€šããŽã¬ã³ã³ããã®äœåãSiddharthaãããã®æç²ã䜿çšããããšã«ã€ããŠè¬çœªããããšæããŸãã
- èè ã¯æ¬ç©ã®ããã°ã©ããŒã§ã¯ãããŸãããäœãããŠããã®ãããããªãå Žåããã®ãããžã§ã¯ãã§äœ¿çšãããŠããã³ãŒãããã¯ããã¯ã䜿çšããããšã¯ãå§ãããŸããã
- ã³ãŒãã®ã¹ã¿ã€ã«ããaã³ããŸã;ãã£ãšèªã¿ããããæããã«æžãããŠãããããããŸããããããã¯é¢çœããããŸããã 圌ããèšãããã«ãéãšå人ã®ããã®ãããžã§ã¯ãã
- ãŸããç¹ã«è±èªã®ããã¹ãã§ã¯ãèåçã«ã€ããŠãè¬çœªããŸãã May Hartããã®å¹Žã
- æ瀺ããããããã¿ã€ãã®æ§èœã¯ã[ã¯ãã 70; linux x86_64; 1366x768]ããšã©ãŒã¡ãã»ãŒãžã«ã€ããŠãä»ã®ãã©ãããã©ãŒã ããã³ããã€ã¹ã®ãŠãŒã¶ãŒã«éåžžã«æè¬ããŸãã
- ããã¯ãããã¿ã€ãã§ãããè°è«ã®ããã®ææ¡ããããããã¯ã§ã-ã¢ãããŒããšååãç§ã¯å®è£ ãšçŸçåŽé¢ã®ãã¹ãŠã®æ¹å€ã«è°è«ã䌎ãããšãæ±ããŸãã
ãµãŒããŒ
ãµãŒããŒã®èšèªã¯golangã§ãã åªããæšæºã©ã€ãã©ãªãšããã¥ã¡ã³ããåããã·ã³ãã«ã§é«éãªèšèª...å°ãé¢åã§ãã æåã®éžæã¯ãšãªãã·ã«/ã¢ãŒã©ã³ã«ããã£ãŠããŸããããç§ã¯ïŒæ¯èŒçïŒãŽãŒãç¥ã£ãŠããã®ã§ããããè€éã«ããªãããšã«æ±ºããŸããïŒãããŠå¿ èŠãªããã±ãŒãžã¯ãŽãŒã®ããã ãã§ããïŒã
go-communityã§ã®Webãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšã¯æšå¥šãããŸããïŒ åœç¶ ãèªãã䟡å€ããããŸãïŒã劥åæ¡ãéžæããŠlabstack / echoãã€ã¯ããã¬ãŒã ã¯ãŒã¯ã䜿çšããããšã§ãã«ãŒãã³ã®éãæžãããããã©ãŒãã³ã¹ãããŸãäœäžããªãããã«æããŸãã
ããŒã¿ããŒã¹ãšããŠtidwall / buntdbã䜿çšããŸãã 第äžã«ãçµã¿èŸŒã¿ãœãªã¥ãŒã·ã§ã³ã¯ãã䟿å©ã§ãªãŒããŒãããã®ã³ã¹ããåæžãã第äºã«ãã€ã³ã¡ã¢ãª+ããŒ/å€- ããããã§ã¹ã¿ã€ãªãã·ã¥ é«éã§ãã£ãã·ã¥äžèŠã JSONã§ããŒã¿ãä¿åããã³æäŸããå€æŽæã«ã®ã¿æ€èšŒããŸãã
第2äžä»£ã®i3ã§ã¯ãçµã¿èŸŒã¿ãã¬ãŒã¯0.5ã10ããªç§ã®ããŸããŸãªèŠæ±ã®å®è¡æéã衚瀺ããŸãã åããã·ã³ã§wrkãå®è¡ããŠããç®çã«ã¯ååãªçµæãåŸãããŸãã
â comico git:(master) wrk -t2 -c500 -d60s http://localhost:9001/pub/mtimes Running 1m test @ http://localhost:9001/pub/mtimes 2 threads and 500 connections Thread Stats Avg Stdev Max +/- Stdev Latency 20.74ms 16.68ms 236.16ms 72.69% Req/Sec 13.19k 627.43 15.62k 73.58% 1575522 requests in 1.00m, 449.26MB read Requests/sec: 26231.85 Transfer/sec: 7.48MB
â comico git:(master) wrk -t2 -c500 -d60s http://localhost:9001/pub/goods Running 1m test @ http://localhost:9001/pub/goods 2 threads and 500 connections Thread Stats Avg Stdev Max +/- Stdev Latency 61.79ms 65.96ms 643.73ms 86.48% Req/Sec 5.26k 705.24 7.88k 70.31% 628215 requests in 1.00m, 8.44GB read Requests/sec: 10454.44 Transfer/sec: 143.89MB
ãããžã§ã¯ãæ§é
comico / modelããã±ãŒãžã¯3ã€ã®ãã¡ã€ã«ã«åãããŠããŸãã
model.go-ããŒã¿åãšäžè¬çãªæ©èœã®èª¬æãå«ãŸããŸããäœæ/æŽæ°ïŒbuntdbã¯ãããã®æäœãåºå¥ãããã¬ã³ãŒãã®ååšãæåã§ç¢ºèªããŸãïŒãæ€èšŒãåé€ã1ã€ã®ã¬ã³ãŒãã®ååŸããªã¹ãã®ååŸã
rules.go-ç¹å®ã®ã¿ã€ãããã³ãã®ã³ã°æ©èœã®æ€èšŒã«ãŒã«ãå«ãŸããŠããŸãã
files.go-ç»åãæäœããŸãã
Mtimesã¿ã€ãã¯ãããŒã¿ããŒã¹å
ã®æ®ãã®ã¿ã€ãã®æåŸã®å€æŽã«é¢ããããŒã¿ãæ ŒçŽããã©ã®ããŒã¿ãå€æŽãããããã¯ã©ã€ã¢ã³ãã«äŒããŸãã
comico / bdããã±ãŒãžã«ã¯ãããŒã¿ããŒã¹ãšããåãããããã®äžè¬åãããé¢æ°ãå«ãŸããŠããŸãïŒäœæãåé€ãéžæãªã©ãBuntdbã¯ããã¡ã€ã«ãžã®ãã¹ãŠã®å€æŽãããã¹ã圢åŒã§ä¿åããŸãïŒãã®å Žåã1ç§ã«1åïŒã dbãã¡ã€ã«ã¯ç·šéãããããã©ã³ã¶ã¯ã·ã§ã³ãæåããå Žåã®å€æŽãæåŸã«è¿œå ãããŸãã ããŒã¿ã®æŽåæ§ã«éåããç§ã®è©Šã¿ã¯ãã¹ãŠå€±æããŸãããææªã®å ŽåãæåŸã®1ç§ã®å€æŽã¯å€±ãããŸãã
å®è£
ã§ã¯ãåã¿ã€ãã¯åå¥ã®ãã¡ã€ã«å
ã®åå¥ã®ããŒã¿ããŒã¹ã«å¯Ÿå¿ããŸãïŒã¡ã¢ãªã«æä»çã«ä¿åãããåèµ·åæã«ãŒãã«ãªã»ããããããã°ãé€ãïŒã ããã¯äž»ã«ãããã¯ã¢ãããšç®¡çã®äŸ¿å©ããå°ããªãã©ã¹-1ã€ã®ã¿ã€ãã®ããŒã¿ã®ã¿ãžã®ãããã¯ã¢ã¯ã»ã¹ãç·šéããããã®ãªãŒãã³ãã©ã³ã¶ã¯ã·ã§ã³ã«ãããã®ã§ãã
ãã®ããã±ãŒãžã¯ãããšãã°SQLãªã©ã®å¥ã®ããŒã¿ããŒã¹ã䜿çšããŠãåæ§ã®ããã±ãŒãžã«ç°¡åã«çœ®ãæããããšãã§ããŸãã ãããè¡ãã«ã¯ã次ã®æ©èœãå®è£
ããã ãã§ååã§ãã
func Delete(db byte, key string) error func Exist(db byte, key string) bool func Insert(db byte, key, val string) error func ReadAll(db byte, pattern string) (str string, err error) func ReadOne(db byte, key string) (str string, err error) func Renew(db byte, key string) (err error, newId string)
comico / cnstããã±ãŒãžã«ã¯ããã¹ãŠã®ããã±ãŒãžã«å¿ èŠãªå®æ°ïŒããŒã¿åãã¢ã¯ã·ã§ã³åããŠãŒã¶ãŒåïŒãå«ãŸããŠããŸãã ããã«ããã®ããã±ãŒãžã«ã¯ããµãŒããŒãå€éšã®äžçã«å¿çããããã®äººéãèªãããã¹ãŠã®ã¡ãã»ãŒãžãå«ãŸããŠããŸãã
comico / serverããã±ãŒãžã«ã¯ã«ãŒãã£ã³ã°æ å ±ãå«ãŸããŠããŸãã ãŸããæ°è¡ïŒEchoéçºè ã®ãããïŒãJWTã䜿çšããæ¿èªãCORSãCSPããããŒããã¬ãŒãéçé åžãgzipãACMEèªå蚌ææžãªã©ãæ§æãããŠããŸãã
APIãšã³ããªãã€ã³ã
URL | ããŒã¿ | 説æ |
---|---|---|
get / pub /ïŒåå|æçš¿|ãŠãŒã¶ãŒ| cmnts |ãã¡ã€ã«ïŒ | - | é¢é£ãããç¥ãããæçš¿ããŠãŒã¶ãŒãã³ã¡ã³ãããã¡ã€ã«ã®é åãååŸãã |
get / pub / mtimes | - | åããŒã¿åã®æçµå€æŽæå»ãååŸãã |
æçš¿/ãã/ãã°ã€ã³ | {id *ïŒãã°ã€ã³ãpass *ïŒãã¹ã¯ãŒã} | JWTããŒã¯ã³ãšãã®æéãè¿ããŸã |
æçš¿/ãã/ãã¹ | {id *ãpass *} | ããŒã¿ãæ£ããå Žåãæ°ãããŠãŒã¶ãŒãäœæããŸã |
put / api / pass | {id *ãpass *} | ãã¹ã¯ãŒãæŽæ° |
æçš¿| put / api / goods | {id *ãauth *ãtitle *ãtype *ãprice *ãtext *ãimagesïŒ[]ãTableïŒ{keyïŒvalue}} | åºåãäœæ/æŽæ° |
æçš¿| put / api / posts | {id *ãauth *ãtitle *ãtype *ãtext *} | ãã©ãŒã©ã æçš¿ã®äœæ/æŽæ° |
æçš¿| put / api / users | {id *ãã¿ã€ãã«ãã¿ã€ããã¹ããŒã¿ã¹ãã¹ã¯ã©ã€ãïŒ[]ãç¡èŠïŒ[]ãããŒãã«ïŒ{ããŒïŒå€}} | ãŠãŒã¶ãŒã®äœæ/æŽæ° |
æçš¿/ API / cmnts | {id *ãauth *ãowner *ãtype *ãtoãtext *} | ã³ã¡ã³ãäœæ |
delete / api /ïŒåå|æçš¿|ãŠãŒã¶ãŒ| cmntsïŒ/ [id] | - | IDãæã€ãšã³ããªãåé€ããŸã |
get / api / activity | - | çŸåšã®ãŠãŒã¶ãŒã®åä¿¡ã³ã¡ã³ãã®æçµèªã¿åãæéãæŽæ°ããŸã |
get / api /ïŒè³Œèª|ç¡èŠïŒ/ [ã¿ã°] | - | ãµãã¹ã¯ãªãã·ã§ã³ã®ãªã¹ãã«ãŠãŒã¶ãŒã¿ã°ãè¿œå ãŸãã¯åé€ããŸãïŒååšããå ŽåïŒ/ç¡èŠ |
æçš¿/ API /ã¢ããããŒã/ïŒåå|ãŠãŒã¶ãŒïŒ | ãã«ãããŒãïŒååããã¡ã€ã«ïŒ | åçåºå/ãŠãŒã¶ãŒã¢ãã¿ãŒãã¢ããããŒãããŸã |
*-å¿
é ãã£ãŒã«ã
api-èªèšŒãå¿
èŠãpub-ããã
äžèšãšäžèŽããªãgetèŠæ±ã§ã¯ããµãŒããŒã¯ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ãéçã«æ€çŽ¢ããŸãïŒããšãã°ã/ img / *-imagesã/ index.html-clientïŒã
ãã¹ãŠã®APIãã€ã³ãã¯ãæåããå Žåã¯200ã®å¿çã³ãŒãããšã©ãŒãçºçããå Žåã¯400ãŸãã¯404ãå¿
èŠãªå Žåã¯çãã¡ãã»ãŒãžãè¿ããŸãã
ã¢ã¯ã»ã¹æš©ã¯ç°¡åã§ãããšã³ããªã®äœæã¯æ¿èªããããŠãŒã¶ãŒãå©çšã§ããäœæè
ãšã¢ãã¬ãŒã¿ãŒã¯ç·šéã§ãã管çè
ã¯ã¢ãã¬ãŒã¿ãŒãç·šéããŠä»»åœã§ããŸãã
APIã«ã¯æãåçŽãªã¢ã³ããã³ãã«ãè£
åãããŠããŸãïŒã¢ã¯ã·ã§ã³ã¯ãŠãŒã¶ãŒIDãšIPãšãšãã«èšé²ãããé »ç¹ã«ã¢ã¯ã»ã¹ããå Žåã¯ãå°ãåŸ
ã€ããã«æ±ãããšã©ãŒãè¿ãããŸãïŒãã¹ã¯ãŒãã®æšæž¬ã«åœ¹ç«ã¡ãŸãïŒã
ã客æ§
ãªã¢ã¯ãã£ãWeb'aã®ã³ã³ã»ããã奜ãã§ããææ°ã®ãµã€ã/ã¢ããªã±ãŒã·ã§ã³ã®ã»ãšãã©ã¯ããã®ã³ã³ã»ããã®ãã¬ãŒã ã¯ãŒã¯å ã§ããŸãã¯å®å šã«éçã«è¡ãããã¹ãã ãšæããŸãã äžæ¹ãã¡ã¬ãã€ãã®JSã³ãŒãã䜿çšããåçŽãªãµã€ãã¯ææ°æ¶æ²ãããããããŸããã ç§ã®æèŠã§ã¯ããã®ïŒãããŠããã ãã§ã¯ãªãïŒåé¡ã¯Svelteã«ãã£ãŠè§£æ±ºã§ããã ãã®ãã¬ãŒã ã¯ãŒã¯ïŒãŸãã¯ãªã¢ã¯ãã£ãã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããããã®èšèªïŒã¯ãå¿ èŠãªæ©èœã«ãããŠVueã«å£ããŸããããåŠå®ã§ããªãå©ç¹ããããŸã-ã³ã³ããŒãã³ãã¯ããã©JSã«ã³ã³ãã€ã«ããããã³ãã«ã®ãµã€ãºãšä»®æ³ãã·ã³ïŒbundle.min.js.gzïŒã®è² è·ã®äž¡æ¹ãåæžããŸãããªãŒããŒã±ããã¯æ§ããã§ãä»æ¥ã®åºæºã§ã¯24KBã§ãïŒã 詳现ã¯å ¬åŒææžã«èšèŒãããŠããŸã ã
ããªãŒããŒã±ããã®ã¯ã©ã€ã¢ã³ãããŒããšããŠSvelteJSããªãŒããŒã±ãããéžæããŸãããªããããªã¹ãšãããžã§ã¯ãã®ãããªãçºå±ã«æåãå°œãããŸãã
PSç§ã¯èª°ããæãããããªãã åã¹ãã·ã£ãªã¹ããšåãããžã§ã¯ãã«ã¯ç¬èªã®ããŒã«ããããšç¢ºä¿¡ããŠããŸãã
顧客/ããŒã¿
URL
ããã²ãŒã·ã§ã³ã«äœ¿çšããŸãã è€æ°ããŒãžã®ããã¥ã¡ã³ããã·ãã¥ã¬ãŒãããã®ã§ã¯ãªãã代ããã«ãã¯ãšãªãã©ã¡ãŒã¿ã§ããã·ã¥ããŒãžã䜿çšããŸãã é·ç§»ã®å Žåãjsãªãã§éåžžã®<a>ã䜿çšã§ããŸãã
ã»ã¯ã·ã§ã³ã¯ããŒã¿ã¿ã€ãã«å¯Ÿå¿ããŸãïŒ /ïŒgoods ã /ïŒposts ã /ïŒusers ã
ãã©ã¡ãŒã¿ãŒïŒïŒId = record_id ãïŒPage = page_number ãïŒSearch = search_query ã
ããã€ãã®äŸïŒ
- /ïŒpostsïŒid = 1542309643ïŒpage = 999ïŒsearch = {authïŒanon} - æçš¿ã»ã¯ã·ã§ã³ãæçš¿id- 1542309643 ãã³ã¡ã³ãããŒãž-999 ãæ€çŽ¢ã¯ãšãª- {authïŒanon}
- /ïŒgoodsïŒpage = 2ïŒsearch = siddhartha-ã»ã¯ã·ã§ã³goods ãã»ã¯ã·ã§ã³page- 2 ãæ€çŽ¢ã¯ãšãª-siddhartha
- /ïŒgoodsïŒsearch = wer {keyïŒvalue} t-ã»ã¯ã·ã§ã³goods ãæ€çŽ¢ã¯ãšãª-åºåã®ããããŒãŸãã¯ããã¹ãã®ã¯ãŒãéšåæååãšãåºåã®è¡šéšåã®ããŒããããã£ã®éšåæååå€ã®æ€çŽ¢ã§æ§æãããŸã
- /ïŒgoodsïŒsearch = {modelïŒ100ãdisplayïŒ256} -ããã§ã¯é¡æšã«ãã£ãŠãã¹ãŠãæ確ã«ãªã£ãŠãããšæããŸã
å®è£ ã«ããã解æãšURLçæã®æ©èœã¯æ¬¡ã®ããã«ãªããŸãã
window.addEventListener('hashchange', function() { const hash = location.hash.slice(1).split('?'), result = {} if (!!hash[1]) hash[1].split('&').forEach(str => { str = str.split('=') if (!!str[0] && !!str[1]) result[decodeURI(str[0]).toLowerCase()] = decodeURI(str[1]).toLowerCase() }) result.type = hash[0] || 'goods' store.set({ hash: result }) }) function goto({ type, id, page, search }) { const { hash } = store.get(), args = arguments[0], query = [] new Array('id', 'page', 'search').forEach(key => { const value = args[key] !== undefined ? args[key] : hash[key] || null if (value !== null) query.push(key + '=' + value) }) location.hash = (type || hash.type || 'goods') + (!!query.length ? '?' + query.join('&') : '') }
API
ãµãŒããŒãšããŒã¿ã亀æããã«ã¯ããã§ããAPIã䜿çšããŸãã æŽæ°ãããã¬ã³ãŒããçãééã§ããŠã³ããŒãããã«ã¯ã / pub / mtimesã«ãªã¯ãšã¹ããè¡ããŸããããããã®ã¿ã€ãã®æçµå€æŽæå»ãããŒã«ã«ã®ãã®ãšç°ãªãå Žåããã®ã¿ã€ãã®ãªã¹ããããŒãããŸãã ã¯ããSSEãŸãã¯WebSocketsãä»ããæŽæ°ã®éç¥ãšå¢åããŒããå®è£ ããããšãã§ããŸãããããã®å Žåã¯éç¥ãªãã§å®è¡ã§ããŸãã ç§ãã¡ã¯äœãåŸãŸããïŒ
async function GET(type) { const response = await fetch(location.origin + '/pub/' + type) .catch(() => ({ ok: false })) if (type === 'mtimes') store.set({ online: response.ok }) return response.ok ? await response.json() : [] } async function checkUpdate(type, mtimes, updates = {}) { const local = store.get()._mtimes, net = mtimes || await GET('mtimes') if (!net[type] || local[type] === net[type]) return const value = updates['_' + type] = await GET(type) local[type] = net[type]; updates._mtimes = local if (!!value && !!value.sort) store.set(updates) } async function checkUpdates() { setTimeout(() => checkUpdates(), 30000) const mtimes = await store.GET('mtimes') new Array('users', 'goods', 'posts', 'cmnts', 'files') .forEach(type => checkUpdate(type, mtimes)) }
ãã£ã«ã¿ãªã³ã°ãšããŒãžããŒã·ã§ã³ã«ã¯ãããã²ãŒã·ã§ã³ããŒã¿ã«åºã¥ããŠèšç®ãããSvelteããããã£ã䜿çšããŸãã èšç®ãããå€ã®æ¹åã¯æ¬¡ã®ãšããã§ãïŒ items ïŒãµãŒããŒããã®ã¬ã³ãŒãã®é åïŒ=> ignoreItems ïŒçŸåšã®ãŠãŒã¶ãŒã®ç¡èŠãªã¹ãã«åºã¥ããŠãã£ã«ã¿ãŒãããã¬ã³ãŒãïŒ=> scribedItems ïŒãã®ã¢ãŒããæå¹ã«ãªã£ãŠããå Žåããµãã¹ã¯ãªãã·ã§ã³ã®ãªã¹ãã«ãã£ãŠã¬ã³ãŒãããã£ã«ã¿ãŒããŸãïŒ=> curItemããã³curItems ïŒçŸåšã®ã¬ã³ãŒããèšç®ããŸãïŒã»ã¯ã·ã§ã³ã«å¿ããŠïŒ=> filtersItems ïŒæ€çŽ¢ã¯ãšãªã«å¿ããŠã¬ã³ãŒãããã£ã«ã¿ãªã³ã°ããŸããã¬ã³ãŒãã1ã€ãããªãå Žå-ã³ã¡ã³ãããã£ã«ã¿ãªã³ã°ããŸãïŒ=> maxPage ïŒããŒãžããã12ã¬ã³ãŒã/ã³ã¡ã³ãã«åºã¥ããŠããŒãžæ°ãèšç®ããŸãïŒ=> pagedItem ïŒæçµé åãè¿ããŸã çŸåšã®ããŒãžçªå·ã«åºã¥ããæçš¿/ã³ã¡ã³ãïŒã
ã³ã¡ã³ããšç»åïŒ commentsãš_images ïŒã¯åå¥ã«èšç®ãããã¿ã€ããšææè ã¬ã³ãŒãããšã«ã°ã«ãŒãåãããŸãã
èšç®ã¯èªåçã«è¡ãããé¢é£ããããŒã¿ãå€æŽãããå Žåã«ã®ã¿ãäžéããŒã¿ã¯åžžã«ã¡ã¢ãªå ã«ãããŸãã ããã«é¢ããŠãäžæå¿«ãªçµè«ãåºããŸã-倧éã®æ å ±ããã³/ãŸãã¯é »ç¹ãªæŽæ°ã®ããã«ã倧éã®ãªãœãŒã¹ãè²»ããããšãã§ããŸãã
ãã£ãã·ã¥
ãªãã©ã€ã³ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã決å®ã«åŸã£ãŠãã¬ã³ãŒãã®ä¿åãšlocalStorageã®ç¶æ ã®ããã€ãã®åŽé¢ãCacheStorageã®ã€ã¡ãŒãžãã¡ã€ã«ãå®è£ ããŸãã localStorageã®æäœã¯éåžžã«ç°¡åã§ããã_ããã¬ãã£ãã¯ã¹ãæã€ããããã£ã¯ãå€æŽæã«åèµ·åæã«èªåçã«ä¿åããã³åŸ©å ãããããšã«åæããŸãã 次ã«ããœãªã¥ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
store.on('state', ({ changed, current }) => { Object.keys(changed).forEach(prop => { if (!prop.indexOf('_')) localStorage.setItem(prop, JSON.stringify(current[prop])) }) }) function loadState(state = {}) { for (let i = 0; i < localStorage.length; i++) { const prop = localStorage.key(i) const value = JSON.parse(localStorage.getItem(prop) || 'null') if (!!value && !prop.indexOf('_')) state[prop] = value } store.set(state) }
ãã¡ã€ã«ã¯ããå°ãè€éã§ãã ãŸãããµãŒããŒããéãããŠãããã¹ãŠã®å®éã®ãã¡ã€ã«ã®ãªã¹ãïŒäœææéãå«ãïŒã䜿çšããŸãã ãã®ãªã¹ããæŽæ°ãããšããå€ãå€ãšæ¯èŒããæ°ãããã¡ã€ã«ãCacheStorageã«å ¥ããããããå€ããã¡ã€ã«ãåé€ããŸãã
async function cacheImages(newFiles) { const oldFiles = JSON.parse(localStorage.getItem('_files') || '[]') const cache = await caches.open('comico') oldFiles.forEach(file => { if (!~newFiles.indexOf(file)) { const [ id, type ] = file.split(':') cache.delete(`/img/${type}_${id}_sm.jpg`) }}) newFiles.forEach(file => { if (!~oldFiles.indexOf(file)) { const [ id, type ] = file.split(':'), src = `/img/${type}_${id}_sm.jpg` cache.add(new Request(src, { cache: 'no-cache' })) }}) }
次ã«ããµãŒããŒã«æ¥ç¶ããã«ãã¡ã€ã«ãCacheStorageããååŸãããããã«ããã§ããã®åäœãåå®çŸ©ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãServiceWorkerã䜿çšããå¿ èŠããããŸãã åæã«ãä»ã®ãã¡ã€ã«ããã£ãã·ã¥ãããããã«èšå®ããŠããµãŒããŒãšã®é信以å€ã§æ©èœããããã«ããŸãã
const CACHE = 'comico', FILES = [ '/', '/bundle.css', '/bundle.js' ] self.addEventListener('install', (e) => { e.waitUntil(caches.open(CACHE).then(cache => cache.addAll(FILES)) .then(() => self.skipWaiting())) }) self.addEventListener('fetch', (e) => { const r = e.request if (r.method !== 'GET' || !!~r.url.indexOf('/pub/') || !!~r.url.indexOf('/api/')) return if (!!~r.url.lastIndexOf('_sm.jpg') && e.request.cache !== 'no-cache') return e.respondWith(fromCache(r)) e.respondWith(toCache(r)) }) async function fromCache(request) { return await (await caches.open(CACHE)).match(request) || new Response(null, { status: 404 }) } async function toCache(request) { const response = await fetch(request).catch(() => fromCache(request)) if (!!response && response.ok) (await caches.open(CACHE)).put(request, response.clone()) return response }
ããã¯å°ãäžåšçšã«èŠããŸããããã®æ©èœãå®è¡ããŸãã
ã¯ã©ã€ã¢ã³ã/ã€ã³ã¿ãŒãã§ãŒã¹
ã³ã³ããŒãã³ãæ§é ïŒ
index.html | main.js
== header.html-ããŽãã¹ããŒã¿ã¹ããŒãã¡ã€ã³ã¡ãã¥ãŒãäžéšããã²ãŒã·ã§ã³ã¡ãã¥ãŒãã³ã¡ã³ãéä¿¡ãã©ãŒã ãå«ãŸããŠããŸã
== aside.html-ãã¹ãŠã®ã¢ãŒãã«ã³ã³ããŒãã³ãã®ã³ã³ããã§ã
==== goodForm.html-åºåãè¿œå ããã³ç·šéããããã®ãã©ãŒã
==== userForm.html-çŸåšã®ãŠãŒã¶ãŒã®ãã©ãŒã ãç·šé
====== tableForm.html-衚圢åŒã®ããŒã¿ãå
¥åããããã®ãã©ãŒã ã®ãã©ã°ã¡ã³ã
==== postForm.html-ãã©ãŒã©ã æçš¿ã®ãã©ãŒã
==== login.html-ãã°ã€ã³/ç»é²ãã©ãŒã
==== activity.html-çŸåšã®ãŠãŒã¶ãŒå®ã®ã³ã¡ã³ãã衚瀺ããŸã
==== goodImage.html-ã¡ã€ã³ããã³è¿œå ã®åçåºåã衚瀺
== main.html-ã¡ã€ã³ã³ã³ãã³ãã®ã³ã³ãã
==== goods.html-ãªã¹ããŸãã¯åäžã®çºè¡šã«ãŒã
==== users.html-ãŠãŒã¶ãŒãåã
==== posts.html-æããã ãšæã
==== cmnts.html-çŸåšã®æçš¿ã«å¯Ÿããã³ã¡ã³ãã®ãªã¹ã
====== cmntsPager.html-ã³ã¡ã³ãã®ããŒãžããŒã·ã§ã³
- åã³ã³ããŒãã³ãã§ã¯ãhtmlã¿ã°ã®æ°ãæå°éã«æããŸãã
- ã¯ã©ã¹ã¯ç¶æ ã®ã€ã³ãžã±ãŒã¿ãšããŠã®ã¿äœ¿çšããŸãã
- ã¹ãã¢ãšåæ§ã®é¢æ°ã䜿çšããŸãïŒsvelteã¹ãã¢ã®ããããã£ãšã¡ãœããã¯ãæ¥é èŸã$ããã³ã³ããŒãã³ãã«è¿œå ããããšã«ãããã³ã³ããŒãã³ãããçŽæ¥äœ¿çšã§ããŸãïŒã
- ã»ãšãã©ã®é¢æ°ã¯ããŠãŒã¶ãŒã€ãã³ããŸãã¯ç¹å®ã®ããããã£ã®å€æŽãäºæããç¶æ ããŒã¿ãæäœããäœæ¥çµæãç¶æ ã«ä¿åããŠçµäºããŸãã ãããã£ãŠãã³ãŒãã®å°ããªäžè²«æ§ãšæ¡åŒµæ§ãå®çŸãããŸãã
- ãã©ã³ãžã·ã§ã³ãšä»ã®UIã€ãã³ãã®èŠããã®é床ã«ã€ããŠã¯ãå¯èœãªéããããã¯ã°ã©ãŠã³ãã§çºçããããŒã¿ãšãçŸåšã®èšç®çµæã䜿çšããã€ã³ã¿ãŒãã§ã€ã¹ã«é¢é£ä»ããããã¢ã¯ã·ã§ã³ã§ã®æäœãåé¢ããå¿ èŠã«å¿ããŠåæ§ç¯ããæ®ãã¯ãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠèŠªåã«å®è¡ãããŸãã
- å ¥åãããã©ãŒã ã®ããŒã¿ã¯ãå ¥åã倱ãããšãé²ãããã«ãå ¥åããšã«localStorageã«ä¿åãããŸãã
- ãã¹ãŠã®ã³ã³ããŒãã³ãã§ãäžå€ã¢ãŒãã䜿çšããŸãããã®ã¢ãŒãã§ã¯ããã£ãŒã«ãã®å€æŽã«é¢ä¿ãªããæ°ãããªã³ã¯ãåä¿¡ãããå Žåã«ã®ã¿ããããã£ãªããžã§ã¯ããå€æŽããããšèŠãªãããŸãããããã£ãŠãã³ãŒãéããããã«å¢å ããã«ãããããããã¢ããªã±ãŒã·ã§ã³ãå°ãé«éåããŸãã
顧客/管ç
ããŒããŒãã䜿çšããŠå¶åŸ¡ããã«ã¯ã次ã®çµã¿åããã䜿çšããŸãã
Alt + s / Alt + a-ã¬ã³ãŒãã®ããŒãžãååŸã«åãæ¿ããŸãã1ã€ã®ã¬ã³ãŒããã³ã¡ã³ãã®ããŒãžãåãæ¿ããŸãã
Alt + w / Alt + q-次/åã®ã¬ã³ãŒãïŒååšããå ŽåïŒã«ç§»åãããªã¹ãã¢ãŒããåäžã¬ã³ãŒãããã³ç»åãã¥ãŒã§åäœããŸã
Alt + x / Alt + z-ããŒãžãäžäžã«ã¹ã¯ããŒã«ããŸãã ç»å衚瀺ã¢ãŒãã§ã¯ãç»åãåšæçã«ååŸã«åãæ¿ããŸã
ãšã¹ã±ãŒã -éããŠããå Žåã¯ã¢ãŒãã«ãŠã£ã³ããŠãéããåäžã®ãšã³ããªãéããŠããå Žåã¯ãªã¹ãã«æ»ãããªã¹ãã¢ãŒãã§æ€çŽ¢ã¯ãšãªããã£ã³ã»ã«ããŸã
Alt + c-çŸåšã®ã¢ãŒãã«å¿ããŠãæ€çŽ¢ãŸãã¯ã³ã¡ã³ããã£ãŒã«ãã«ãã©ãŒã«ã¹ããŸã
Alt + v-åäžã®åºåã®åç衚瀺ã¢ãŒããæå¹/ç¡å¹ã«ããŸã
Alt + r-æ¿èªããããŠãŒã¶ãŒã®åä¿¡ã³ã¡ã³ãã®ãªã¹ããéã/éãã
Alt + t-æããããŒããšæãããŒããåãæ¿ããŸã
Alt + g-åºåã®ãªã¹ã
Alt + u-ãŠãŒã¶ãŒ
Alt + P-ãã©ãŒã©ã
å€ãã®ãã©ãŠã¶ã§ã¯ããããã®çµã¿åããããã©ãŠã¶èªäœã«ãã£ãŠäœ¿çšãããŠããããšãç¥ã£ãŠããŸãããç§ã®ã¯ãã ã§ã¯ããã£ãšäŸ¿å©ãªãã®ãæãä»ãããšãã§ããŸããã§ããã ç§ã¯ããªãã®ææ¡ã«åãã§ããã§ãããã
ããŒããŒãã«å ããŠããã¡ãããã©ãŠã¶ã³ã³ãœãŒã«ã䜿çšã§ããŸãã ããšãã°ã store.goBackïŒïŒ ã store.nextPageïŒïŒ ã store.prevPageïŒïŒ ã store.nextItemïŒïŒ ã store.prevItemïŒïŒ ã store.searchïŒstringValueïŒ ã store.checkUpdateïŒ 'goods' || 'ãŠãŒã¶ãŒ '||'æçš¿ '||'ãã¡ã€ã« '||' cmnts 'ïŒ -ååãæå³ããããšãè¡ããŸãã store.getïŒïŒãcommentsããã³store.getïŒïŒ._ images-ã°ã«ãŒãåããããã¡ã€ã«ãšã³ã¡ã³ããè¿ããŸãã store.getïŒïŒ.ignoredItemsããã³store.getïŒïŒãscribedItemsã¯ãç¡èŠããŠè¿œè·¡ããã¬ã³ãŒãã®ãªã¹ãã§ãã ãã¹ãŠã®äžéããŒã¿ããã³èšç®ããŒã¿ã®å®å šãªãªã¹ãã¯ã store.getïŒïŒããå ¥æã§ããŸãã 誰ããããçå£ã«å¿ èŠãšãã人ã¯ããªããšæããŸãããããšãã°ããŠãŒã¶ãŒããšã«ãšã³ããªããã£ã«ã¿ãªã³ã°ããã³ã³ãœãŒã«ããåé€ãããšéåžžã«äŸ¿å©ãªããã«æããŸãã
ãããã«
ããã§ããããžã§ã¯ãã®ç¥ãåããçµäºã§ããŸã;ãœãŒã¹ã³ãŒãã§è©³çŽ°ã確èªã§ããŸãã ãã®çµæãã»ãšãã©ã®ããªããŒã¿ãã»ãã¥ãªãã£ãé床ãå¯çšæ§ãªã©ã®ãã§ãã«ãŒã§ãããªãé«éã§ã³ã³ãã¯ããªã¢ããªã±ãŒã·ã§ã³ãåŸãããŸãããã¿ãŒã²ãããçµã£ãæé©åãªãã§è¯ãçµæã瀺ããŠããŸãã
ãããã¿ã€ãã§äœ¿çšãããã¢ããªã±ãŒã·ã§ã³ãç·šæããã¢ãããŒããã©ã®çšåºŠæ£åœåãããããèœãšãç©Žã¯äœããæ ¹æ¬çã«ç°ãªãæ¹æ³ã§äœãå®è£
ããã®ããã³ãã¥ããã£ã®æèŠãç¥ããããšæããŸãã
ãœãŒã¹ã³ãŒãããµã³ãã«ã®ã€ã³ã¹ããŒã«æé ãããã³ãã¢ã¯ãã¡ã ïŒã©ãã ç Žå£ãã åæ³ã®æ çµã¿ã§ãã¹ãããããïŒã
è¿œèšã çµè«ãšããŠã¯å°ãåæ¥çã§ãã ãã®ãããªã¬ãã«ã§ããéã®ããã«ããã°ã©ãã³ã°ãå§ããããšã¯æ¬åœã«å¯èœã§ããïŒ ããã§ãªãå ŽåããŸã第äžã«äœãæ¢ãã¹ããããããããªãã圌ãã¯ä»ã䌌ããããªã¹ã¿ãã¯ã§é¢çœãäœåãæ¢ããŠããå ŽæãæããŠãã ããã ããããšã
è¿œèšã ãéãšä»äºã«ã€ããŠããå°ãã ãã®ã¢ã€ãã¢ã¯ãããã§ããïŒçµŠäžã«ã€ããŠèå³æ·±ããããžã§ã¯ãã«åãçµãæºåãã§ããŠãããšä»®å®ããŸãããæ¯æããåžå Žãå€§å¹ ã«äžåã£ãŠããå Žåãéçšäž»ã®ç«¶äºçžæã§ããã¿ã¹ã¯ãšãã®æ¯æãã«é¢ããããŒã¿ã¯å ¬éãããŸãïŒå¯çšæ§ãšããã©ãŒãã³ã¹ã®å質ãè©äŸ¡ããããã®ã³ãŒããæãŸããïŒããé«ãå Žåãã¿ã¹ã¯ãå®è¡ããããã«å€ãã®ãéãæäŸããããšãã§ããŸã-å€ãã®ããã©ãŒããŒã¯ãäœäŸ¡æ Œã§ãµãŒãã¹ãæäŸããããšãã§ããŸãã ç¶æ³ã«ãã£ãŠã¯ããã®ãããªã¹ããŒã ã¯ãåžå ŽïŒITïŒãããæé©ãã€å ¬æ£ã«ãã©ã³ã¹ãããã®ã§ããããïŒ