ããã«ã¡ã¯ããšã³ãžãã¢ã® id:yunagi_n ã§ãã ã¿ãªãã㯠JavaScript ã«ãããŠã URL ãããŒã¹ãããšããã©ã® API ã䜿çšããŠããŸããïŒ ãã£ãšãç°¡åãªã®ã¯ã URL Interface ã䜿çšããããšã ãšæããŸãã ä»åã¯ããã® URL Interface ãã JavaScript ã®å®è¡ãšã³ãžã³ã«ãã£ãŠæåãç°ãªãããšã«ã€ããŠæžãããšæããŸãã äºåæ
å ± ãã®èšäºã®å
容ã¯ã以äžã®ããŒãžã§ã³ã«ãŠç¢ºèªãè¡ã£ãŠããŸãã macOS 12.5.1 Google Chrome 107.0.5304.121 Safari 15.6.1 Firefox 107.0.1 æ¬é¡ URL Interface ã¯ã åçš®ãã©ãŠã¶ããã³ Node.js äžã§ URL ãæ±ãããã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ããé©åœãª URL ãæž¡ããšãäžã®ããã«åéšåæ¯ã«åè§£ããŠãããŠã URL ãå
ã«äœãããããšãã«äŸ¿å©ãªã€ã³ã¿ãŒãã§ãŒã¹ã§ãã const url = new URL( "https://example.com" ) console.log(url.protocol) // => https: ä»åã¯ããã㪠URL Interface ã«ã€ããŠããã©ãŠã¶ãŒå®è£
æ¯ã«ããéãã«ã€ããŠã®ã話ã§ãã äŸãã°ãæããã䜿ãããŠãã Chromium ç³»å (V8) ã®å Žåã¯ãäŸãšã㊠https://example.com/test?a=b#c ã®ãã㪠URL ãæž¡ããšäžèšã®ãããªçµæãè¿ããŸãã const url = new URL( "https://example.com/test?a=b#c" ) console.dir(url) /* * URL { * hash: "#c", * host: "example.com", * hostname: "example.com", * href: "https://example.com/test?a=b#c", * origin: "https://example.com", * password: "", * pathname: "/test", * port: "", * protocol: "https:" * search: "?a=b", * username: "" * } */ ãã®ãããªäžè¬ç㪠URL (ããã§ã¯ãããã³ã«éšã HTTP ããã³ HTTPS ã§ãããã®ãæã) ã§ããã°ãã©ã®ãã©ãŠã¶ãŒã§ãåãæåãããŠãããŸããã§ã¯ãäŸãã° FTP ã®ã»ãã¥ã¢çã®ãããã³ã«ã§ãã FTPS ãå«ãã ftps://example.com/test ãæž¡ããšã©ããªãã§ããããïŒ V8 ã®å Žåã¯ä»¥äžã®ãããªçµæãè¿ããŸãã const url = new URL( "ftps://example.com/test" ) console.dir(url) /* * URL { * hash: "", * host: "", * hostname: "", * href: "ftps://example.com/test", * origin: "null", * password: "", * pathname: "//example.com/test", * port: "", * protocol: "ftps:", * search: "", * username: "" * } */ éåžžã® URL ãæž¡ããå Žåãšæåã«éãããããŸãããã¡ãªã¿ã« Firefox (SpiderMonkey ç³») ã§ãåãçµæãè¿ããŠãããŸãã ã§ã¯ WebKit ç³»å (JavaScript Core) ã§ã¯ã©ãã§ãããïŒçãã¯ä»¥äžã®ããã«ãªããŸãã const url = new URL( "ftps://example.com/test" ) console.dir(url) /* * URL { * hash: "", * host: "example.com", * hostname: "example.com", * href: "ftps://example.com/test", * origin: "ftps://example.com", * password: "", * pathname: "/test", * port: "", * protocol: "ftps:", * search: "", * username: "" * } */ ããããã host éšã®æ±ããç°ãªã£ãŠããã®ãç¹åŸŽã§ãã V8 㯠host éšã¯ç¡ãã£ããã®ãšããŠæ±ãã pathname ã«ãã¹ãŠãå«ããŠããã®ã«å¯Ÿãã JavaScript Core ã¯ããããç§ãã¡ãã€ã¡ãŒãžããçµæãšåããã®ãã€ãŸã㯠host éšã example.com ãšããŠè¿ããŠãããŠããŸãã ã§ã¯ã»ãã¥ã¢ã§ã¯ãªã FTP ãã€ãŸãã¯ãããã³ã«éšã ftp: ã® URL ãæž¡ããšã©ããªãã§ããããïŒçãã¯ãã¹ãŠã®ãã©ãŠã¶ãŒã§æ¬¡ã®ãããªçµæã«ãªããŸãã const url = new URL( "ftp://example.com/test" ) console.dir(url) /* * URL { * hash: "", * host: "example.com", * hostname: "example.com", * href: "ftp://example.com/test", * origin: "ftp://example.com", * password: "", * pathname: "/test", * port: "", * protocol: "ftp:" * search: "", * username: "" * } */ ããããåããããã«ã Chromium ç³»åãš Firefox ç³»åã¯ããããã³ã«éšã«ãã£ãŠã host ããã³ hostname ã®ããŒã¹çµæãç°ãªããŸãã ã§ã¯ãæåãç°ãªãã®ãããã ãã ãšãããšãä»ã«ãç°ãªãéšåããããŸãã äŸãã°ã hostname ã«å€§æåå°æåã®äž¡æ¹ãå«ãæååãæž¡ããéã®çµæã¯ãäžè¬çãªãããã³ã«ã®å Žåã¯ä»¥äžã®ããã«ãªããŸãã const url = new URL( "http://ExAmple.COM/test" ) console.dir(url) /* * URL { * hash: "", * host: "example.com", * hostname: "example.com", * href: "http://example.com/test", * origin: "http://example.com", * password: "", * pathname: "/test", * port: "", * protocol: "http:" * search: "", * username: "" * } */ ãããããã§ãªããã®ãããã§ã¯ Web3 ã®æèã§ãã䜿ãããŠãã IPFS ãããã³ã«ã® URL ãæž¡ããå Žåã Chromium ç³»ã Safari ã§ã¯ä»¥äžã®ããã«ãªãã const url = new URL( "ipfs://QmR3u53ksjcNVzUinvC1hjjKxEpWR2a9SeWhhh7MtofjHe" ) console.dir(url) /* * URL { hash: "", host: "", hostname: "", href: "ipfs://QmR3u53ksjcNVzUinvC1hjjKxEpWR2a9SeWhhh7MtofjHe", origin: "null", password: "", pathname: "//QmR3u53ksjcNVzUinvC1hjjKxEpWR2a9SeWhhh7MtofjHe", port: "", protocol: "ipfs:", search: "", username: "", * } */ SpiderMonkey ç³» (Firefox) ã§ã¯ãããªããŸãã const url = new URL( "ipfs://QmR3u53ksjcNVzUinvC1hjjKxEpWR2a9SeWhhh7MtofjHe" ) console.dir(url) /* * URL { hash: "", host: "qmr3u53ksjcnvzuinvc1hjjkxepwr2a9sewhhh7mtofjhe", hostname: "qmr3u53ksjcnvzuinvc1hjjkxepwr2a9sewhhh7mtofjhe", href: "ipfs://QmR3u53ksjcNVzUinvC1hjjKxEpWR2a9SeWhhh7MtofjHe/", origin: "ipfs://qmr3u53ksjcnvzuinvc1hjjkxepwr2a9sewhhh7mtofjhe", password: "", pathname: "/", port: "", protocol: "ipfs:", search: "", username: "", * } */ é¢çœãã®ãã href ã¯å€§æåå°æåãåºå¥ããŠããŸããã host ãªã©ãã®ä»ã¯å€§æåå°æåãåºå¥ããããã¹ãŠå°æåã§è¡šãããŠããŸãã çµè«ãšããŠã¯ãå³ã«ãŸãšãããšä»¥äžã®ãããªæåãããŸãã Parse Result \ URL Protocol http / https / ftp ftps ipfs hash ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ - - host ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ Safari ã§æåãç°ãªã Firefox ã§æåãç°ãªã hostname ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ Safari ã§æåãç°ãªã Firefox ã§æåãç°ãªã href ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ Firefox ã§æåãç°ãªã origin ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ Safari ã§æåãç°ãªã Firefox ã§æåãç°ãªã pathname ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ Safari ã§æåãç°ãªã Firefox ã§æåãç°ãªã protocol ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ ãã¹ãŠã®ãã©ãŠã¶ã§æåã¯äžèŽ ã§ã¯ããã¹ãŠã®ãã©ãŠã¶ã§æåãæããã«ã¯ã©ã®ããã«ããã°ããã®ã§ããããïŒ çãã¯ç°¡åã§ã URL Interface ã䜿çšããŠããªãããŒãµãŒã©ã€ãã©ãªã䜿çšããŸãã äŸãšããŠã¯ url-parse ãªã©ã䜿çšã§ããŸãã ãã ãããã¡ããå
éšã§ isSpecial ãšãã颿°ã§äžéšãããã³ã«ã§ã®ã¿ã origin ãã»ããããŠãããããã®ã§ããããã³ã«ãéãã°ã origin ã«éã£ãŠã¯æåãç°ãªããŸãã ãããããã以å€ã«ã€ããŠã¯ã©ã®ãã©ãŠã¶ããããã³ã«ã§ãå
±éã®åäœãããŠããã®ã§ãããå€ãã®ãã©ãŠã¶ã§åäžã®æåãå®çŸããã«ã¯ãååã§ã¯ãªãã§ããããã ãšããããšã§ãä»å㯠URL Interface ã®æåã®éãã«ã€ããŠã解説ããŸããã