ãµãŒããŒãããã€ãã®ã«ã¹ã¿ã ã«ãŒããå®çŸ©ããŠãããŠãŒã¹ã±ãŒã¹ããããŸãã ãã©ãŠã¶ããããã®ã«ãŒããããŒããããšããã©ãŠã¶ã®URLãèªèãããªããããã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãåŒãç¶ãã§ããŒãžã404ã«çœ®ãæãããŸã§ãäºæ³ãããã³ã³ãã³ããçæé衚瀺ãããŸãã
ç§ãæåã«èããã®ã¯ãããã§matchPath
ã䜿çšã§ãããããããªããšããããš
æ€çŽ¢ããŒãžã«ããã¯ããããšã§å¯èœãããããªããšæãããããŸããã
ã®ã£ãããŒããŒãžã§ã³ïŒ1.9.221
Node.jsããŒãžã§ã³ïŒ8.9.1
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒmacOS
ãã©ãŠã¶ãèªã¿èŸŒãŸããåŸãJavaScriptãèªã¿èŸŒãŸããURLãäžæã§ãããšå€æããã404ããŒãžãã¬ã³ããªã³ã°ããããŸã§ãäºæ³ãããããŒãžãçæé衚瀺ãããŸãã
ãµãŒããŒã§ã¬ã³ããªã³ã°ãããããŒãžã¯ã«ã¹ã¿ã URLã§å©çšå¯èœã§ãããã¯ã©ã€ã¢ã³ãã®èªã¿èŸŒã¿æã«404ããŒãžã«çœ®ãæããããªãããã«ããå¿ èŠããããŸãã
1. git clone https://github.com/TuckerWhitehouse/gatsby-client-routing-issue
2. npm install
3. npm run build
4. npm start
5. open http://localhost:3000
ãµãŒããŒãã¬ã³ããªã³ã°ããŠãããã¹ãããããªãã®ã¯ãªãã§ããïŒ
ãã¹ãããããªããšããããšã¯å°ãªããªããŸããïŒãã¹ã«äžèŽããæ£èŠè¡šçŸãèšè¿°ã§ããŸãïŒãéãªãã倧ãããªããŸãã å®éã®ã»ããã¢ããã¯ãgatsbyãµã€ããå«ãå€æ°ã®ç°ãªãã¢ããªãžã®ãªããŒã¹ãããã·ãè¡ãApacheãµãŒããŒã®èåŸã«ãããŸãã ãããã®ã¢ããªã®ããããã䜿çšã§ããªããªã£ãå ŽåããŸãã¯å éšãµãŒããŒãšã©ãŒãè¿ãããå Žåã¯ãgatsbyãµã€ãã®äžéšã§ããã«ã¹ã¿ã ãšã©ãŒããŒãžãè¿ãããŸãã
ãããã£ãŠããã€ã§ãapp1ã䜿çšã§ããªãã誀åäœããŠããå Žåã/ app1ãžã®ãªã¯ãšã¹ãã¯/error/unavailable.htmlãŸãã¯/error/internal.htmlã®ã³ã³ãã³ããè¿ããapp2ãªã©ã«ãåãããšãåœãŠã¯ãŸããŸãã ã
䜿çšããŠmatchPath
ã®ããã«/^(app1|app2)/.*/
ã®ã§ãäž¡æ¹ãšã䜿çšã§ããªãå
éšãšã©ãŒããŒãžäžã§ã¯ãªããè¡ãäœæ¥ãfindPage
ç¥ããªãç§ã¯å®éã«æå³ããããŒãžïŒURLã«åºã¥ããŸãïŒãŠãŒã¶ãŒã«è¡šç€ºããŸãã
ã°ããŒãã«å€æ°ã䜿çšãã ___history
ãš___loader
ãonClientEntry
ãããããããããšã§ãäœããæ©èœãããããšãã§ããŸããã ãããã®ã°ããŒãã«ãå
¬éããgatsbyã«äŸåããŠãããããéåžžã«è匱ã§ãããããäžè¬åããŠgatsbyã«è¿œå ããæ¹æ³ããããã©ããã¯ããããŸããã
ãããé©çšå±¥æŽã¯ã props.location.pathname
ã䜿çšããŠé話ããã£ããããŸã
component-renderer.jsïŒL18-L28
ãããããŒããŒã¯window.location.pathname
çŽæ¥äœ¿çšããã£ããããŸã
ãããã¯ã·ã§ã³-app.jsïŒL155
// gatsby-browser.js
exports.onClientEntry = () => {
// Check for a custom pathname
const pathname = global.___pathname
if (!pathname) return
// Override the history location
const history = global.___history
history.location.pathname = pathname
// Patch the resource loader
const loader = global.___loader
const { getResourcesForPathname } = loader
loader.getResourcesForPathname = (path, ...args) => {
return getResourcesForPathname(path === location.pathname ? pathname : path, ...args)
}
}
// src/pages/page1.js
import React from "react"
import Helmet from 'react-helmet'
export default () => (
<div>
<Helmet>
<script>{`window.___pathname = '/page1'`}</script>
</Helmet>
<div>Page 1!</div>
</div>
)
ãŸãããã®æ©èœãç¡å¹ã«ãããã«ããªãã·ã§ã³ãå¿ èŠã§ããããšã«åæããŸãã ãŸããåã«ã¯ãŸããªãèšå®ããããå®å šãªGatsbyãµã€ããžã®ç§»è¡ãå®äºãããŸã§ããã®æ©èœãäžæçã«ç¡å¹ã«ããŸãã
ãã«ãæã®åçŽãªãã©ã°ãæé©ã§ãã
ããã¯ã©ãïŒ ããã«å¯Ÿãã解決çã¯ãããŸããïŒ
æçµçã«ãå¿ èŠãªãã¹ã«äžèŽããããã«pages.jsonãå€æŽããŸããã åºæ¬çã«ããã¹åãä¿®æ£ããŠaddPagesArrayãåŒã³åºããŸãã
ãªãããããšã©ãŒãã¹ããŒããã®ããŸã ããããŸãããïŒ ããŒãžã¯æ£åžžã«èªã¿èŸŒãŸããæ©èœããŸãã ããã¯ããã¹ãšäžèŽããªãå ŽåãããããèŠåã«ãªãã¯ãã§ãã
ããã¯èšã£ãŠããconfigsvsã©ã³ã¿ã€ã ã³ãŒããä»ããŠpages.jsonãå€æŽãããããšã¬ã¬ã³ããªæ¹æ³ããããã©ããã¯ããããŸããã
ãã®åé¡ãã¶ã€ãããã
ç§ãåãçµãã§ãããããžã§ã¯ãã§ãåæ§ã®åé¡ãçºçããŠããŸãã ã·ã³ã°ã«ããŒãžã®ã®ã£ãããŒã¢ããªãæ§ç¯ããã©ã³ãã£ã³ã°ããŒãžãžã§ãã¬ãŒã¿ãŒãæ§ç¯ããŠããŸãã ãã®åé¡ã¯ããã¡ã€ã³å€ã®ã©ã³ãã£ã³ã°ããŒãžãæäŸããããšãããšãã«çºçããŸãã
ããšãã°ãã¡ã€ã³ã®Gatsbyã¢ããªwww.example.com
ãŸãã Gatsbyã®ã©ã³ãã£ã³ã°ããŒãžãååŸããŠwww.example.com/trial
æäŸãããµãŒãã¹ããããŸãã ãããã£ãŠãã©ã³ãã£ã³ã°ããŒãžã®URLã¯www.example.com/trail/ad-123
ã®ããã«ãªããŸãããã¹ãŠã®JSãèªã¿èŸŒãŸããã«ãŒã¿ãŒãåŒãç¶ããŸã§ãããŒãžã¯æåã¯æ£åžžã«èªã¿èŸŒãŸããŸãã ã©ã³ãã£ã³ã°ããŒãžã¯ãã¹ã確èªãããããã©ãã«ãããããããªãããããã¹ãå€æŽããŠããŒãžãã«ãŒãã«é
眮ããããšããŸããããã¯ããã®www.example.com/ad-123
ãçµæãšããŠ404ãªãã€ã¬ã¯ãã«ãªããŸãã
ãããä¿®æ£ããããã®æ§æå¯èœãªãªãã·ã§ã³ãè¿œå ããèšç»ã¯ãããŸããïŒ ã®ã£ãããŒããŒã ã¯PRãåãå ¥ããŸããïŒ
@ alex-greco-harrysãã¹ãã¬ãã£ãã¯ã¹ã¯ããã®ã·ããªãªã§äœ¿çšããããã®ã®ããã§ãã
ãŸããèªåã®Webãµã€ãã§Google Adsenseãé©åã«å®è¡ããã«ã¯ãã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãç¡å¹ã«ããå¿ èŠããããŸããã
Google Adsenseã®èªååºåã¯ã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãæ€åºãããã«ãŒããæŽæ°ãããŠãåºåã¯æŽæ°ãããŸããã
ãšã«ãããã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãç¡å¹ã«ããããšã¯ã§ããŸããïŒ
ãã®ãããªå Žåã¯ã gatsby-link
代ããã«a
ã¿ã°ã䜿çšã§ããŸã
ã°ããŒãã«å€æ°ã䜿çšãã
___history
ãš___loader
ãonClientEntry
ãããããããããšã§ãäœããæ©èœãããããšãã§ããŸããã ãããã®ã°ããŒãã«ãå ¬éããgatsbyã«äŸåããŠãããããéåžžã«è匱ã§ãããããäžè¬åããŠgatsbyã«è¿œå ããæ¹æ³ããããã©ããã¯ããããŸããã
- ãããé©çšå±¥æŽã¯ã
props.location.pathname
ã䜿çšããŠé話ããã£ããããŸã
component-renderer.jsïŒL18-L28- ãããããŒããŒã¯
window.location.pathname
çŽæ¥äœ¿çšããã£ããããŸã
ãããã¯ã·ã§ã³-app.jsïŒL155// gatsby-browser.js exports.onClientEntry = () => { // Check for a custom pathname const pathname = global.___pathname if (!pathname) return // Override the history location const history = global.___history history.location.pathname = pathname // Patch the resource loader const loader = global.___loader const { getResourcesForPathname } = loader loader.getResourcesForPathname = (path, ...args) => { return getResourcesForPathname(path === location.pathname ? pathname : path, ...args) } }
// src/pages/page1.js import React from "react" import Helmet from 'react-helmet' export default () => ( <div> <Helmet> <script>{`window.___pathname = '/page1'`}</script> </Helmet> <div>Page 1!</div> </div> )
@TuckerWhitehouseã©ããã___history
ã ___loader
ãå
¥æããŠããŸããïŒ ããªãã®äŸãè€è£œããããšãããšãã°ããŒãã«ã®ããã2ã€ã®ããããã£ã¯undfined
ã§ãã
@ alex-greco-harrysãã¹ãã¬ãã£ãã¯ã¹ã¯ããã®ã·ããªãªã§äœ¿çšããããã®ã®ããã§ãã
@ jgierer12ããã¯ç§ã®åé¡ã®æåã®éšåã解決ããã®ã«åœ¹ç«ã¡ãŸãã 2ã€ç®ã¯ãããŒãžãã¬ã³ããªã³ã°ããããŸã§æçµãã¹ãäžæã§ãããšããããšã§ãã éçããŒãžã®ã³ã¬ã¯ã·ã§ã³ãååŸããã³ã³ããŒãžã§ã³çã«åºã¥ããŠããããæäŸããåŠç¿ãµãŒãã¹ããããŸãã ãããã£ãŠããã¹example.com/go/
ã§ãããŒãžã®ã³ã¬ã¯ã·ã§ã³ã®1ã€ãæäŸã§ããŸãã ãããã£ãŠã example.com/go/first-page
ãexample.com/go/second-page
ãããªãã¹ã§ããŒãžãæäŸããããšã¯ãããŸããã ãããã¯äž¡æ¹ãšãexample.com/go/page
ãã¹ã§æäŸãããŸãã
åºæ¬çã«ãç§ãéæããããšããŠããã®ã¯ã奜ããªãã¹ã§gatsbyããŒãžãæäŸããããšã§ãã
@ alex-greco-harrysãããã®ã°ããŒãã«ã¯gatsbyv1ã«ãã£ãŠå ¬éãããŸããã v2ãžã®ã¢ããã°ã¬ãŒãã«ãããåºç€ãšãªãã«ãŒã¿ãŒãreact-routerããreach-routerã«åãæ¿ããããããšãããã£ãŠããã®ã§ããããã®ã°ããŒãã«ã圱é¿ãåãããšæããŸãã
ãŸããGatsbyã䜿çšããŠã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšèããŠãããã«ãŒãã£ã³ã°ãå®å šã«ç¡å¹ã«ããããšèããŠããŸãã V2ãšäºææ§ã®ããåé¿çïŒ @TuckerWhitehouseã®ïŒãç¥ã£ãŠãã人ã¯ããŸããïŒ
æŽæ°ïŒ
ã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ã_ç¡å¹ã«ãã_解決çãèŠã€ããããšã¯ã§ããŸããã§ãããã次ã®ããã«èšå®ããããšã§ã@ alex-greco-harrysãªã©ã«ãã£ãŠåç
§ããããªãã€ã¬ã¯ããé²ãããšãã§ããŸããã
window.page = window.page || {};
window.page.path = window.location.pathname;
gatsby-browser.jsã§ãproduction-app.jsã®ãã®æ¡ä»¶ä»ããã§ãã¯ãç絡ããŸãã ãã®æ¡ä»¶ä»ããªãã€ã¬ã¯ãã¯ããæ£èŠãã¹ãå®éã®ãã¹ãšäžèŽããããããšãè©Šã¿ãäžèšã§åç §ãããŠããïŒIMOïŒäºæããªãåäœãåŒãèµ·ãããŸãã
ç§ããããå¿ èŠã§ãã
çŸåšãã®ã£ãããŒãçæããã³ãŒããå¥ã®ãããžã§ã¯ãã§äœ¿çšããŠãããè€æ°ã®ããŒãžã§äœ¿çšããŠããŸãã Gatsbyã¯éçã³ãŒããçæããããã䜿çšããŠããŸãã ãããã£ãŠã pathPrefix
ã䜿çšããŠãç¹å®ã®ãã¹ã®äžã§ãã¹ãŠãçæããŠæäŸã§ããããã«ããŸããã ããããã°ããã¹ãŠãããã§èŠæ±ãããããŒãžã®ãã©ã°ã¡ã³ããšããŠã¬ã³ããªã³ã°ãããŸãã ãã ããã¹ã¯ãªããå
ã«ããããã pathPrefix
ãžã®äžèŠãªãªãã€ã¬ã¯ããåžžã«çºçããŸãã ãã«ããããã³ã«ã
ãŸããGatsbyã䜿çšããŠã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšèããŠãããã«ãŒãã£ã³ã°ãå®å šã«ç¡å¹ã«ããããšèããŠããŸãã V2ãšäºææ§ã®ããåé¿çïŒ @TuckerWhitehouseã®ïŒãç¥ã£ãŠãã人ã¯ããŸããïŒ
æŽæ°ïŒ
ã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ã_ç¡å¹ã«ãã_解決çãèŠã€ããããšã¯ã§ããŸããã§ãããã次ã®ããã«èšå®ããããšã§ã@ alex-greco-harrysãªã©ã«ãã£ãŠåç §ããããªãã€ã¬ã¯ããé²ãããšãã§ããŸãããwindow.page = window.page || {}; window.page.path = window.location.pathname;
gatsby-browser.jsã§ãproduction-app.jsã®ãã®æ¡ä»¶ä»ããã§ãã¯ãç絡ããŸãã ãã®æ¡ä»¶ä»ããªãã€ã¬ã¯ãã¯ããæ£èŠãã¹ãå®éã®ãã¹ãšäžèŽããããããšãè©Šã¿ãäžèšã§åç §ãããŠããïŒIMOïŒäºæããªãåäœãåŒãèµ·ãããŸãã
@ethagnawlç§ã¯ãä»»æã®URLã§æäŸã§ããã·ã³ã°ã«ããŒãžã¢ããªãäœæããããã®ããããŒãªçš®é¡ã®ãœãªã¥ãŒã·ã§ã³ãæã£ãŠããŸãã åäžããŒãžãšã¯ãå®éã«ã¯ã«ãŒãã£ã³ã°ããŸã£ãããªãåäžããŒãžãæå³ããŸãã
次ã®Gatsbyã®äŸãèŠããšã https ïŒ
15è¡ç®ã§ãã®ãã¡ã€ã«ãç·šéã<Page path="/*" {...props} />
ã16è¡ç®ãåé€ã§ããŸãããã®ã¢ããªã±ãŒã·ã§ã³ããã«ããããšãã©ã®ãã¹ã§ããå®çŸ©ããPage
ãæäŸãããŸãã ããããããã®Page
奜ããªããã«äœãããšãã§ããŸãã ããã§ããã®ããŒãžãä»»æã®ãã¹ã§ãã¹ãããå¿
èŠãããå Žåããªãã€ã¬ã¯ãã¯è¡šç€ºãããŸããã
ãã®ãœãªã¥ãŒã·ã§ã³ãã¢ããªå ã®è€æ°ã®ããŒãžã§ã©ã®ããã«æ©èœããããç解ã§ããŸããã§ããã ç§ã®ãããžã§ã¯ãã®ç®æšã¯ãä»»æã®URLã§åäžã®ã®ã£ãããŒããŒãžïŒããŒã±ãã£ã³ã°ã©ã³ãã£ã³ã°ããŒãžïŒãæäŸããããšã§ããã
ããããŠãŒã¹ã±ãŒã¹ã«åœ¹ç«ã€ãã©ããã¯ããããŸããããå°æ¥ã®çºèŠã«ã€ãªããå¯èœæ§ããããŸãã
ããã¥ã¡ã³ãã®html.jsã®ã«ã¹ã¿ãã€ãºã®æ瀺ã«åŸãã {this.props.postBodyComponents}
ãåé€ããããšã§ããããå®çŸã§ããŸããã
ãã®ã¹ã¬ãããã©ãã ãã¢ã¯ãã£ãã§ãããã«åºã¥ããŠããã®åäœãæããŠãŒã¶ãŒã®æ°ã¯èªæã§ã¯ãªãããã§ãã
ãŠãŒã¹ã±ãŒã¹ããã°ããç¹°ãè¿ãããã«ïŒéçãª_site_ãžã§ãã¬ãŒã¿ãŒã§ã¯ãªãéçãª_page_ãžã§ãã¬ãŒã¿ãŒãšããŠGatsbyã䜿çšãããïŒ
ããã§ãã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãç¡å¹ã«ããŠãããã¬ãã«ã®æ§æãªãã·ã§ã³ã«ãªãæ©èœã«æåŸ ã¯ãããŸããïŒ ç§ã¯PRãæåºããããšæããŸããããããåãå ¥ããããå¯èœæ§ããªãå Žåã¯ãããã«æéãè²»ãããããããŸããã
ããã¯ã@ ethagnawlãè¿œå ããããã®åççãªæ©èœã®ããã§ãã ããã¯éåžžã«ç¹æ®ãªãšããžã±ãŒã¹ã§ããããã人ã ãèªåã®ããŠããããšãå®å šã«æèã§ããããã«ãdangeouslySetInnerHTMLã®ãããªéåžžã«é·ããŠäžå¿«ãªååãå¿ èŠã«ãªããšæããŸãã
ãã®åé¡ã«å¯ŸåŠããPRã§ã®ç§ã®æåã®ãã¹ã¯ãããã«ãããŸãã ãã®åé¡ã«ã¶ã€ãã£ãã¡ã³ãããä»ã®ãŠãŒã¶ãŒããã®ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãã
aPR @ ethagnawlãäœæããŠããã ãããããšãããããŸã
次ã®æ©èœãæ©èœããªãçç±ãããäžåºŠæãåºããŠãã ããã
// Implement the Gatsby API âonCreatePageâ. This is
// called after every page is created.
exports.onCreatePage = ({ page, actions }) => {
const { createPage } = actions;
page.matchPath = `${page.path}*`;
createPage(page);
};
@wardpeetç§ã¯ãããããŸããããšç¢ºä¿¡ããŠãããç§ãäžã§è¿°ã¹ã解決çã«äŒŒãŠ@TuckerWhitehouseãæäŸãããœãªã¥ãŒã·ã§ã³ãåç §ããŠãã ãããããã¯æ©èœããªããªããŸããïŒã
IMOã¯ããã®æŠå¿µãäœç³»åããããšã¯äŸ¡å€ããããŸããããããããã¥ã¡ã³ããããç°¡åã«ãããã®ãã©ã°ã䜿çšããŠããã€ãã¹/ããŒãã³ã°ãªã©ã«ãã£ãŠè¿œå ã®æé©åãè¡ãããšãã§ããããã§ãã Gatsbyããã®ããã«äœ¿çšãããŠããå Žåã¯é¢ä¿ã®ãªãæ©èœã
ããã«ã matchPath
ã䜿çšããã«ã¯ãã¬ã³ããªã³ã°ããããŒãžãåæ ãããã©ãŠã¶ã®URLãå¿
èŠã§ãããããã¯ãgatsbyãµã€ããäžæãªå Žæã«æ¿å
¥ããŠãããšãã«æ©èœããªããªããŸãã ïŒç§ã®æåã®åé¡ã¯ãApacheãªããŒã¹ãããã·ã®èåŸã«ã®ã£ãããŒããããç¹å®ã®ããŒãžãã¬ã³ããªã³ã°ãããåå ãšãªãã«ãŒããããããªãããšã§ããïŒã
@ethagnawlããŒãžã¬ãã«ïŒ page.__disable_client_side_routing__ = true
ïŒã§ã«ãŒãã£ã³ã°ãç¡å¹ã«ããããšã¯å¯èœã ãšæããŸããïŒ ããã¯ããããç§ãæ±ããŠããå
ã®åé¡ã解決ããã§ãããã
ããŒãžã¬ãã«ã§ã«ãŒãã£ã³ã°ãç¡å¹ã«ããããšã¯å¯èœã ãšæããŸãã
ãªãã ãããããŸãããïŒ ããã¯ç§ã®ææ¡ãã解決çã«è¿œå ãããã®ã§ããããããããšã代ããã«ãªãã®ã§ããããïŒ åŸè ã®å ŽåãããŒãžã¬ãã«ã§ãããè¡ãããšã«å©ç¹ã¯ãããŸããïŒ
ç§ã¯ãã®ãªããžããªãèšå®ããŸãã:)
https://github.com/wardpeet/gatsby-plugin-static-site
ããããŠãŒã¹ã±ãŒã¹ã§æ©èœãããã©ããããããªãã
ä»ã®ãšããããªãã¯ããå¿
èŠããããŸã
git clone https://github.com/wardpeet/gatsby-plugin-static-site
npm install
npm run build
npm link
cd "into your project"
npm link gatsby-plugin-static-site
gatsby-config.jsã«gatsby-plugin-static-siteãè¿œå ããŸã
ãããããªãã®ãŠãŒã¹ã±ãŒã¹ã«åé¡ããªããã©ããæããŠãã ãããç§ã¯å®éã«ããããµããŒãããã€ããã¯ãªãã®ã§ãç§ã¯ããã転éããŠããããã§ãïŒsmileïŒ
gitignoreãã¡ã€ã«ã«åé¡ããã£ãããããªããžããªãæŽæ°ããŸããïŒ@ m-allansonã«æè¬ïŒã ãŸããèªåã®ååã§npmã«å ¬éããŸããã
ã ããã€ã³ã¹ããŒã«ãè¡ãããšãã§ããŸã
npm install --save @wardpeet/gatsby-plugin-static-site
@wardpeet/gatsby-plugin-static-site
ãgatsby-config.jsonã«è¿œå ããŸã
ãããè¯ããããªå Žåã¯ãéçºã®ããã«ãã®åäœãç¡å¹ã«ããããã®ããã€ãã®ãã¹ããšããã€ãã®ãªãã·ã§ã³ãè¿œå ã§ããŸãã
ã²ãïŒ
ãã®åé¡ã¯éãã«ãªããŸããã äžæ°å³ãªéãã ð»
å€ãã®åé¡ãçºçããŠãããããçŸåšã30æ¥é䜿çšãããªãã£ãåŸã«åé¡ãã¯ããŒãºããŠããŸãã ããã§ã®æåŸã®æŽæ°ããå°ãªããšã20æ¥ãçµéããŠããŸãã
ãã®åé¡ãèŠéããå ŽåããŸãã¯éãããŸãŸã«ããŠããããå Žåã¯ãããã«è¿ä¿¡ããŠãã ããã ãã®åé¡ãéãããŸãŸã«ããããã«ããå€ããªãããšããã©ãã«ãè¿œå ããããšãã§ããŸãã
Gatsbyã³ãã¥ããã£ã«åå ããŠããã ãããããšãããããŸãã ðªð
ã¬ãã¥ãŒãåŸ ã£ãŠããããã«èŠããã®ã§ããããéãããŸãŸã«ããŠãããã
å€ããªããã©ããã¯ããããŸããããä¿®æ£ãå ããŠãã£ãŒãããã¯ãããããããšæã£ãŠããŸãã
https://github.com/gatsbyjs/gatsby/issues/4337#issuecomment -470075540
誰ãå¿çããªãå Žåã¯ããããã解決ãããŠããã®ã§ããããéããããšããå§ãããŸãã
@wardpeetã¯ããã®ãã©ã°ã€ã³ã䜿çšããŠãã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãæ¡ä»¶ä»ãã§ç¡å¹ã«ããããšã¯å¯èœã§ããïŒ
@wardpeet IIRCãææ¡ãããä¿®æ£ã¯ããã®æ©èœãGatsbyæ§æãªãã·ã§ã³ãšããŠè¿œå ããããã»ã¹ã®æåã®ã¹ãããã§ãïŒããããæçµçã«ïŒã ãããã£ãŠããã®åé¡ãšã®ã£ãããŒã«é¢ããéãããã®_sort of_ã¯åž¯åå€ã«ãªããŸããããã®äŒè©±ãç¶ããã«ã¯ããã®åé¡ãéãããŸãŸã«ããŠããå¿ èŠããããšäž»åŒµãããããããŸããã
@wardpeetã®å ã®åé¡ã¯ãç¹å®ã®ã«ãŒãã®ã¯ã©ã€ã¢ã³ãåŽã«ãŒãã£ã³ã°ãç¡å¹ã«ããããšã§ããã@ ethagnawlã¯ããã©ã°ã€ã³ã察åŠããŠãããšç§ãä¿¡ããŠãããµã€ãå šäœã®ã«ãŒãã£ã³ã°ãç¡å¹ã«ãããŠãŒã¹ã±ãŒã¹ãæèµ·ããŸããã
å€ãCMSã®ãµã€ããGatsbyã«ç§»è¡ããéãã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãäžæçã«ç¡å¹ã«ããå¿ èŠããããŸãã ã¹ã€ãããå®å šã«ã®ã£ãããŒã«åãæ¿ããåã«ãäžåºŠã«1ããŒãžãã€å®è¡ããŠããŸãã
@wardpeetãã©ã°ã€ã³ãè©Šã
@brianbentoè€è£œã¯ãããŸããïŒ ãªããžããªhttps://github.com/wardpeet/gatsby-plugin-static-siteã§åé¡ãäœæã§ããå Žåã¯ãäžè¶³ããŠãããã®ã確èªã§ããŸã
@wardpeetç§ã¯äœããèµ·ããããšãã§ãããã©ããã確èªããŸãã äž»ãªåé¡ã¯ãpathPrefixã䜿çšãããšãåè¿°ã®ãä¿®æ£ãïŒhttps://github.com/gatsbyjs/gatsby/issues/4337#issuecomment-465497418ïŒãæ©èœããªãããšã§ãã åžžã«ã¢ãã¬ã¹ãæåŸ ã©ããã«ãä¿®æ£ãããŸãã
@brianbentoäžèšã®è§£æ±ºçãè©ŠããŸã
@ethagnawlããã§ãURLä¿®æ£ãååŸãããšããã¹ãã¬ãã£ãã¯ã¹ã2åã«ãªããŸãã
ãã "/
å€åç§ã¯ãããééã£ãŠå®è£ ããŠããŸãã ããŒãžã«ãã¹ãã¬ãã£ãã¯ã¹ã䜿çšããŸãããïŒ éçãµã€ããã©ã°ã€ã³ãã¢ã¯ãã£ãã«ããå¿ èŠããããŸããïŒ
ããŒãžã«ãã¹ãã¬ãã£ãã¯ã¹ã䜿çšããŸãããïŒ
ã¯ãã ãŸãããã®ãã©ã³ãã䜿çšããŠãªã¢ãŒãã¢ã»ãããèš±å¯ããŠããŸããã ãããã£ãŠããã©ã³ããåäœãå°å ¥ããŠãä¿®æ£ãæ©èœããããã«ãªã£ãã®ã¯_å¯èœæ§ããããŸã_ã
ãã ããæåã¯ããã¯ã ã£ããããæè¿ã®GatsbyãªãªãŒã¹ïŒç§ã¯è¿œãã€ããŠããªãïŒãç§ã®ã解決çããç Žã£ãå¯èœæ§ãé«ããªããŸãã
@ethagnawlãšãŠã圹ã«ç«ã¡ãŸããïŒ ããããšãããããŸããïŒ @DSchauãassetPrefixæ©èœããã¹ãããããã«ããã€ãã®ãã©ã°ã€ã³ãäœæããããšãç§ã¯ç¥ã£ãŠããŸãã è©ŠããŠã¿ãŸãïŒ
ãã¹ãã¬ãã£ãã¯ã¹ã䜿çšããå¿
èŠãããå Žåã @ wardpeetãœãªã¥ãŒã·ã§ã³ã¯æ©èœããªããã__disable_client_side_routing__
ãææ¡ãããããªãœãªã¥ãŒã·ã§ã³ããããšãéåžžã«äŸ¿å©ã§ãã å䜵ãæ€èšãããå Žåã¯ãåãã§åãçµã¿ãPRãæåºãããŠããã ããŸãã ãã®ã¢ã€ãã¢ã«å¯ŸãããµããŒãã¯ãããŸããããããšãããŒããããã«é©åããªããšæããŸããïŒ
@xavivars確ãã«ãããã欲ããã®ã§ããã䟿å©ã ãšæããŸãã
@xavivarsãã°ããåã«ãã®æ©èœããã¹ããŸãããã @ wardpeetã®ãœãªã¥ãŒã·ã§ã³ãæ¯æããŠéããããŸããã ãã®ã¢ãããŒããåæ€èšããããšãæ€èšããå Žåã¯ãç§ã®è©Šã¿ãæ€èšãã䟡å€ããããããããŸããã
ããããšã@ethagnawl ïŒ ç§ã¯ããªãã®ã¢ãããŒãã調ã¹ãŸããããããŠããã¯ç§ãèããŠãããã®ãšã»ãšãã©åãã§ããã
@wardpeetãœãªã¥ãŒã·ã§ã³ã¯å¥ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããŠãããšæããŸãããªã³ã¯ãå®éã«ãã©ãŠã¶ãŒlocation.href
å€æŽããŠãããããã¢ããªã¯SPAãšããŠåäœããªããããããµãŒããŒåŽãã«ç§»åããŸãã ããããæåã®ãªãã€ã¬ã¯ãããŸã è¡ãããŠããããããŠãŒã¹ã±ãŒã¹ã§æ©èœãããããšãã§ããŸããã§ãããç§ã®æåã®ä»®èª¬ã¯ããã®æ¡ä»¶ãtrue
ãšè©äŸ¡ããprefixPath
ãšã®äœããã®çžäºäœçšããããšãããã®ã§ãã
https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby/cache-dir/production-app.js#L65
æ£åžžã«åäœãããããšãã§ããŸãããïŒ
ä¿®æ£ãå¿ èŠãªããšãã¡ãã£ãšå¿ããŠããŸã£ãã®ã§ã誰ããå®éã®åé¡ã説æããŠãããã°ããã©ã°ã€ã³ã§ããã«äœæ¥ãè¡ãããšãã§ãããããããŸããã ãã¶ããããã®ã»ãšãã©ã¯ãæ°ããããŒãžãããassetPrefixãªãã·ã§ã³ã«ãã£ãŠè§£æ±ºã§ããŸããïŒ
ç解ã§ããªããŠãã¿ãŸããã
@xavivars
æ£åžžã«åäœãããããšãã§ããŸãããïŒ
ç§ã®ããã¯ãšæåºãããPRã¯ã©ã¡ãããç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãé©åã«æ©èœãããŠããŸããããªãã€ã¬ã¯ãã®ãªãåäžã®éçããŒãžçæã§ãã GatsbyããŒã ã¯ãã¢ããªã¬ãã«ã®æ§æãªãã·ã§ã³ã§ã¯ãªããã©ã°ã€ã³ã奜ãããã ã£ãã®ã§ãPRããããããŸããã
@wardpeetã®ãã©ã°ã€ã³ãè©Šãããšã¯ã§ããŸããã§ãããå ¬éããããŸã§ã«ãäœæ¥äžã®Gatsbyãããžã§ã¯ãããã§ã«ãŸãšããŠããããã§ãã ã§ããããããã_æ£ããæ©èœããŠãã_ãã©ããã«ã€ããŠã¯ã³ã¡ã³ãã§ããŸããã
@wardpeet ïŒassetPrefixã¯ãããä¿®æ£ããŸããã ãã©ã°ã€ã³ïŒåºæ¬çã«ãã¯ãªãã¯ãããšã¯ã©ã€ã¢ã³ãåŽã®ãããã²ãŒã·ã§ã³ããç¡å¹ã«ããïŒãšãæ°ãæåã«@ethagnawlãèšåããåé¿çã®äž¡æ¹ã䜿çšããŠæ©èœãããããšãã§ããŸããã
https://github.com/gatsbyjs/gatsby/issues/4337#issuecomment -453244611
ãã®åé¿çã¯ã onClientEntry
ã§çºçãããnavigateãã€ãã³ããç¡å¹ã«ããããã«å¿
èŠã§ãã ããã«ããã¯ãè¿œå ãããã®åé¿çãé©çšããããšãä¿®æ£ããŸããïŒpage.pathãå®éã®ãã¹ã«åŒ·å¶ããŸãïŒã ãããããããäœããã®å¯äœçšãæã£ãŠãããã©ããããããŠãããæ©èœããªããªããŸã§ã«ã©ããããã®æéããããã®ãç§ã«ã¯ããããŸããïŒããã¯ä»¥äžã§ã¯ãããŸããïŒã
çæ³çã«ã¯ãgatsbyããéçããŒãžãžã§ãã¬ãŒã¿ãŒããšããŠäœ¿çšããŠãããšæããã人ã®æ°ãèãããšãããã¯ã¢ããªã¬ãã«ã®æ§æã§ããå¿ èŠããããšæããŸãã
@xavivarsåé¿çãšããŠå ±æã§ãããªã³ã¯ã¯ãããŸããïŒ
å®éã«ã¯ããã§ã¯ãããŸããããããã¯ã»ãšãã©ããã§ãïŒ
åè¿°ã®éçãã©ã°ã€ã³ãgastââby-browser.jsã«è¿œå ããŸã
exports.onClientEntry = () => {
window.page = window.page || {};
window.page.path = window.location.pathname;
}
以äžãæ©èœããŸãããgatsbyã®å éšã«äŸåããŠããŸãã
export function onInitialClientRender() {
window.___navigate = (to, { replace }) => {
if (replace) {
window.location.replace(to);
} else {
window.location.assign(to);
}
};
}
https://github.com/wardpeet/gatsby-plugin-static-siteïŒassetPrefixã®äœ¿çšã¯æ©èœã
äŸãæ©èœããããªã³ã¯ãããåé¡ããããå®éã«å¿
èŠãªãã®ãã©ããããããªãã
https://github.com/wardpeet/gatsby-plugin-static-site/issues/1#issuecomment -494802726
ç§ã«ãšã£ãŠã¯ãgatsbyãã©ã°ã€ã³ã®éçãµã€ã+ AssetPrefix +äžèšã®ããã«ãããã²ãŒãããç¡å¹ã«ãããšãã3ã€ã®ããšãã¹ãŠã§æ©èœããŸãã
ããã§äœãå¿ èŠããç解ããã®ã«ãŸã èŠåŽããŠããããã§ãã gatsby-plugin-static-siteãšassetPrefixã§åé¡ãä¿®æ£ã§ããŸããã
@wardpeet gatsby-plugin-staticã䜿çšãããã¢ãžã®ãªã³ã¯ã¯ãããŸããïŒ
@ethagnawlãåŸ ããããŠç³ãèš³ãããŸããã
ç§ã¯ãã¢ãäœããŸããïŒ
https://github.com/wardpeet/gatsby-demos/tree/static-asset-prefix
ãµã€ãã¯ã©ã€ãã§ãïŒ
https://zen-wright-33c2d8.netlify.com/
äºæ³ã©ããïŒããã³@TuckerWhitehouseãš@ethagnawlãäºæ³ïŒã httpsïŒ //github.com/gatsbyjs/gatsby/issues/4337#issuecomment -453244611ã§æäŸãããŠãããããªå£ãããããœãªã¥ãŒã·ã§ã³ã¯ãå€æŽã«ããæ©èœããªããªããŸããGatsby 2.9.2ã§ã¯ãããã€ãã®çç±ããããŸãã
æåã®ãã®ã¯ã解決å¯èœã§ããããã®è¡ã¯window.page.path = window.location.pathname;
ã«çœ®ãæããå¿
èŠããããŸãwindow.pagePath = window.location.pathname;
URLã¯ã©ã€ã¢ã³ãåŽã®å€æŽãåé¿ããããã
ãã ããããã«ã¯æãŸãããªãå¯äœçšããããŸããpagePathã¯_wrong_ãã¹ã§èšå®ãããpage-data.jsonã¯ããŒããããªããªããŸãïŒããŒãžã®å ã®ãã¹ã«äŸåããæçµçã«ã¬ã³ããªã³ã°ããããã¹ã§ã¯ãªãããïŒ
https://github.com/gatsbyjs/gatsby/commit/49fd769f695ccfa6e990e3eaae7c886f073db19b#diff -2d21ea42ec874a0988977e57b17251aa
ãããæ©èœãããå¯äžã®ãªãã·ã§ã³ã¯ã __disable_client_side_routing__
ãããªå€æ°ãå®éã«å°å
¥ããããå°ãªããšã__disable_client_side_canonical_redirect__
ãå°å
¥ããŠããã®æ¡ä»¶ãç絡ãããããšã ãšæãããŸãïŒ https ïŒ
@wardpeet ïŒãã®ãããªæ§æå€æ°ã®å°å ¥ã«åé¡ã¯ãããŸããïŒ
ãããããããã®ãšã¹ã±ãŒãããããã³ã¢ã§æå¹ã«ããããããŸããã ç§ããã®åé¡ã«ã€ããŠåºæ¬çã«ç解ããŠããã®ã¯ãããã§ãã
gatsbyãµã€ããšãã¹/ my-special-pathãããããµãŒããŒäžã«/ something-elseãšããã«ãŒãããããŸãã / somethingã/ gatsby / my-special-pathã«æžãæãããšãããŒãžã/ my-special-pathã«å€æŽããããšãããããæ©èœããŸãããïŒ
ãããããªãããã©ã°ã€ã³ã§ä¿®æ£ã§ãããã©ããã確èªããŸãã ããã®ã©ã€ããã¢ã¯ãããŸããïŒ
ã¯ããããã¯ãŸãã«åé¡ã§ãã å¥ã®PRããŸãšããããšããŸãïŒhttps://github.com/gatsbyjs/gatsby/pull/15173ã®ããã«ã°ããŒãã«æ§æå€æ°ãšããŠäŸµè¥²çãªãã®ãè¿œå ããŸããïŒã
æ°åã§å¥ã®PRãšããŠããã·ã¥ããã®ã«åãå ¥ãããããããããªãäœãããããŸã
@wardpeetããã¯ããã©ã°ã€ã³ãæ¡åŒµã§ããããã«Gatsbyã«è¿œå ããããã«å¿ èŠã ãšç§ãæããã®ã§ãã PRã«ããã€ãã®äŸãšããã¥ã¡ã³ããè¿œå ããŸãã
Discordã§@DSchauãšäŒè©±ããåŸãã³ã¢ã®è²¢ç®è ã¯ãïŒ15173ãïŒ15180ã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ã³ã¢ã§ã¯ãªãããã©ã°ã€ã³ã«ååšããã¹ãã§ãããšèª¿æŽãããŠããããã§ãã ã ããç§ã¯ããã解決ããããã«ä»ã®ãªãã·ã§ã³ãæ¢æ±ããããšæããŸãã
çŸåšãç§ãèŠã€ããå¯äžã®æ¹æ³ã¯ãã°ããŒãã«æ§æå€æ°ïŒïŒ15173ïŒã䜿çšããŠæ£èŠãªãã€ã¬ã¯ããã§ãã¯ãç絡ããããgatsbyïŒïŒ15180ïŒã®èªèãããã¬ã³ããªã³ã°URLãå€æŽã§ããããã«ããããšã§ããããããã£ãŠãæ£èŠãªãã€ã¬ã¯ããã§ãã¯ã¯çŽæ¥äŸåããŸããã window.location
ã§ããããã£ã«ã¿ãŒå¯èœãªå€æ°ã§ãã
ç§èŠã課é¡ã¯ããã©ã°ã€ã³ã䜿çšããŠãçŸåšæ¡åŒµå¯èœ/ãªãŒããŒã©ã€ãå¯èœã§ã¯ãªãããã«èŠãããã®ãæ¡åŒµ/ãªãŒããŒã©ã€ãããããšã§ãïŒã©ããããå€ãæ¿å
¥ããã«window.location
çŽæ¥äŸåãããšãç§ã«ãšã£ãŠéåžžã«å°é£ã«ãªããŸãïŒããã ããã³ã¢ã®ã³ãŒããå€æŽããã«ãã®åäœãå®è£
ããæ¹æ³ã¯ä»ã«ããããããããŸããã
@xavivars https://github.com/wardpeet/gatsby-plugin-static-site/pull/4ãããŒãžãããã®ä¿®æ£ãå ¬éããŸãã
ãã¢ïŒïŒ5ããŒãžã«ã¯æ£èŠã®ãªãã€ã¬ã¯ãããããŸãïŒ
https://static-asset-prefix--zen-wright-33c2d8.netlify.com/
@ wardpeet / gatsby-plugin-static-siteããŒãžã§ã³0.1.0ãå ¬éããŸããã ããã§ãã®åé¡ãä¿®æ£ãããã¯ãã§ãã ãã¹ãŠã®åé¡ã解決ããªãã£ãå Žåã¯ããæ°è»œã«åéããŠãã ããã
éçãµã€ãã®ãµããŒããæ¹åããæåã®æ¹æ³ã¯ããã©ã°ã€ã³èªäœã«åé¡ãäœæããããšã§ãã https://github.com/wardpeet/gatsby-plugin-static-site/issues/new
äžèšã®ãã©ã°ã€ã³ã䜿çšããåŸã誰ããããã«ééã
GatsbyJSã®çŸåšã®ããŒãžã§ã³ã§æ©èœããåé¿çã¯ãããŸããïŒ
ç§ã¯è©ŠããïŒ
https://github.com/wardpeet/gatsby-plugin-static-site
ããããããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸããã ç§ã¯ããã§åé¡ãæèµ·ããŸããïŒ
https://github.com/wardpeet/gatsby-plugin-static-site/issues/13
ãŸãããªãã€ã¬ã¯ãã®åé¡ãåçŸããããã®ãµã³ãã«ãªããžããªãäœæããŸããã
https://github.com/isi-gach/gastby-static/tree/create-react-app
@ isi-gachæ ¹æ¬çãªåé¡ïŒããªããæåŸ ããŠããããšãããªããèŠãŠããããšãããªããèŠããããšïŒã«ã€ããŠã®ããªãã®èŠè§£ãæäŸããŠããã ããŸãããïŒ ãã®ã¹ã¬ããã®ç§ãã¡ã®äœäººãã¯è©ŠããŸãããããããæ°ãã«ç解ããã®ã«åœ¹ç«ã€ãããããŸããã
ããã«ã¡ã¯@ethagnawl
ãã©ãŠã¶ã®URLãå€æŽãããªãããšãæåŸ
ããŠããŸãããURLãå€æŽãããŠããŸãã次ã®ãããªã§ã¯ãURLã/demo/index.html
ãã/public/
å€æŽãããŠããŸãã
https://www.youtube.com/watch?v=SxYbaDidnkY
ãã®ãããªã¯ãç§ãäœæãããµã³ãã«ãªããžããªã䜿çšããŠèšé²ãããŸããã
https://github.com/isi-gach/gastby-static/tree/create-react-app
@wardpeet/gatsby-plugin-static-site
ã䜿çšããŠãªãã€ã¬ã¯ããé²æ¢ããããšããŠããŸãããæ©èœããŠããªãããã§ãã
ããã«ã¡ã¯@ isi-gach @ethagnawl ã
ããªããèšåããŠããåé¡ã解決ããã¯ãã®@wardpeetãã©ã°ã€ã³ã«éãããŠãããã«ãªã¯ãšã¹ããããã€ããããŸãã
ããããããŒãžãããŠããéã代ããã«ç§ã®ãã©ãŒã¯ã䜿çšã§ããŸã
ããã«ã¡ã¯@xavivars
ãã©ãŒã¯ããnpm
ãè©ŠããŸããããURLã¯å€æŽãããŸããããçœãããŒãžã衚瀺ãããŸãã
https://www.youtube.com/watch?v=uNzk9UYVCxk
ãã®ãããªã¯ããã©ã°ã€ã³ã«ãã£ãŠwardpeet
ãããªãã®ãã®ã«çœ®ãæãã次ã®ãµã³ãã«ãªããžããªã䜿çšããŠèšé²ãããŸããã
https://github.com/isi-gach/gastby-static/tree/create-react-app
åäžããŒãžã«å¯ŸããŠã®ã¿ã¯ã©ã€ã¢ã³ãåŽã«ãŒãã£ã³ã°ãç¡å¹ã«ããã«ã¯ã©ãããã°ããã§ããïŒ
ããªãã¯ããã䜿ãããšãã§ããŸã
exports.onPreBootstrap = ({ store }) => {
const { program } = store.getState()
const filePath = path.join(program.directory, '.cache', 'production-app.js')
const code = fs.readFileSync(filePath, {
encoding: `utf-8`,
})
const newCode = code.replace(
`const { pagePath, location: browserLoc } = window`,
`const { pagePath } = window
let { location: browserLoc } = window
if (window.parent.location !== browserLoc) {
browserLoc = {
pathname: pagePath
}
}
`
)
fs.writeFileSync(filePath, newCode, `utf-8`)
}
ãã©ã°ã€ã³ãã«ããŒãããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããŠãããã©ããã¯ããããŸããããç§ã®å Žåã¯åé¡ãªãåäœããŸãã
æãåèã«ãªãã³ã¡ã³ã
ãã®ã¹ã¬ãããã©ãã ãã¢ã¯ãã£ãã§ãããã«åºã¥ããŠããã®åäœãæããŠãŒã¶ãŒã®æ°ã¯èªæã§ã¯ãªãããã§ãã
ãŠãŒã¹ã±ãŒã¹ããã°ããç¹°ãè¿ãããã«ïŒéçãª_site_ãžã§ãã¬ãŒã¿ãŒã§ã¯ãªãéçãª_page_ãžã§ãã¬ãŒã¿ãŒãšããŠGatsbyã䜿çšãããïŒ
ããã§ãã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ãç¡å¹ã«ããŠãããã¬ãã«ã®æ§æãªãã·ã§ã³ã«ãªãæ©èœã«æåŸ ã¯ãããŸããïŒ ç§ã¯PRãæåºããããšæããŸããããããåãå ¥ããããå¯èœæ§ããªãå Žåã¯ãããã«æéãè²»ãããããããŸããã