JavaScriptã®Import Mapsãšç°å¢å€æ°ã掻çšããåçã¢ãžã¥ãŒã«èšå®ã®æ¹æ³ãæ¢æ±ããæè»ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãå®çŸããŸãã
JavaScript Import Mapsãšç°å¢å€æ°ïŒåçã¢ãžã¥ãŒã«èšå®
çŸä»£ã®Webéçºã«ãããŠãJavaScriptã¢ãžã¥ãŒã«ãå¹ççã«ç®¡çããããšã¯ãã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããWebpackãParcelã®ãããªåŸæ¥ã®ã¢ãžã¥ãŒã«ãã³ãã©ãŒã¯å ç¢ãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããããã«ãã¹ããããå°å ¥ããè€éããå¢ãããšããããããŸããJavaScriptã®import mapsãšç°å¢å€æ°ãçµã¿åãããããšã§ãåçãªã¢ãžã¥ãŒã«èšå®ã®ããã®åŒ·åãªä»£æ¿ææ®µãæäŸãããåãã«ããå¿ èŠãšããã«å®è¡æã«ã¢ãžã¥ãŒã«ã®è§£æ±ºæ¹æ³ãã«ã¹ã¿ãã€ãºã§ããŸãããã®ã¢ãããŒãã¯ãç°ãªããããã€ã¹ããŒãžãé¡§å®¢åºæã®ã»ããã¢ãããªã©ãèšå®ãé »ç¹ã«å€æŽãããç°å¢ã§ç¹ã«äŸ¡å€ããããŸãã
Import Mapsãçè§£ãã
Import mapsã¯ãJavaScriptã¢ãžã¥ãŒã«ã®è§£æ±ºæ¹æ³ãå¶åŸ¡ã§ãããã©ãŠã¶ã®æ©èœã§ãïŒå€ããã©ãŠã¶ãNode.jsåãã«ããªãã£ã«ãå©çšå¯èœã§ãïŒããããã¯æ¬è³ªçã«ã«ãã¯ã¢ããããŒãã«ãšããŠæ©èœããã¢ãžã¥ãŒã«æå®åïŒimportæã§äœ¿çšãããæååïŒãç¹å®ã®URLã«ãããã³ã°ããŸãããã®éæ¥çãªæå®æ¹æ³ã«ã¯ãããã€ãã®å©ç¹ããããŸãã
- ããŒãžã§ã³ç®¡çïŒ import mapãæŽæ°ããã ãã§ãã¢ãžã¥ãŒã«ã®ç°ãªãããŒãžã§ã³ãç°¡åã«åãæ¿ããããšãã§ããŸãã
- CDNçµ±åïŒ æé©åãããèªã¿èŸŒã¿ãšãã£ãã·ã³ã°ã®ããã«ãã¢ãžã¥ãŒã«æå®åãCDNã«åããããšãã§ããŸãã
- éçº/æ¬çªç°å¢ã®åãæ¿ãïŒ ã³ãŒãã倿Žããããšãªããç°ãªãã¢ãžã¥ãŒã«å®è£ ïŒäŸïŒéçºç°å¢ã§ã®ã¢ãã¯ããŒã¿ãæ¬çªç°å¢ã§ã®å®éã®APIåŒã³åºãïŒã䜿çšã§ããŸãã
- ã¢ãžã¥ãŒã«ãšã€ãªã¢ã¹ïŒ é·ããŠåé·ãªURLã®ä»£ããã«ãçããŠèª¬æçãªã¢ãžã¥ãŒã«æå®åã䜿çšã§ããŸãã
Import mapsã¯ã<script>ã¿ã°å
ã§"importmap"ã¿ã€ããæå®ããŠå®çŸ©ãããŸãã
<script type="importmap">
{
"imports": {
"my-module": "/modules/my-module.js",
"lodash": "https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"
}
}
</script>
ããã«ãããJavaScriptã³ãŒãå ã§å®çŸ©ãããæå®åã䜿çšããŠãããã®ã¢ãžã¥ãŒã«ãã€ã³ããŒãã§ããŸãã
import myModule from 'my-module';
import _ from 'lodash';
myModule.doSomething();
console.log(_.VERSION);
ç°å¢å€æ°ã®æŽ»çš
ç°å¢å€æ°ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®å€éšã§èšå®ã§ããåçãªå€ã§ãããããã¯äžè¬çã«ãç°å¢ïŒäŸïŒéçºãã¹ããŒãžã³ã°ãæ¬çªïŒã«ãã£ãŠç°ãªãèšå®æ å ±ãä¿åããããã«äœ¿çšãããŸãããã©ãŠã¶ç°å¢ã§ã¯ãã»ãã¥ãªãã£äžã®çç±ããçã®ç°å¢å€æ°ã«çŽæ¥ã¢ã¯ã»ã¹ããããšã¯ã§ããŸãããããããéåžžã¯ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ããã»ã¹ããããŸãã¯ãã«ãæã®çœ®æãä»ããŠããŒãžã«æ³šå ¥ããããšã§ããã®åäœãã·ãã¥ã¬ãŒãã§ããŸãã
äŸãã°ãNode.jsãµãŒããŒã§ã¯ãç°å¢å€æ°ãHTMLã«åã蟌ãããšãã§ããŸãã
// Node.js server-side rendering example
const express = require('express');
const app = express();
app.get('/', (req, res) => {
const apiUrl = process.env.API_URL || 'http://localhost:3000/api';
const html = `
<!DOCTYPE html>
<html>
<head>
<title>Dynamic Module Configuration</title>
<script>
window.env = {
API_URL: '${apiUrl}'
};
</script>
</head>
<body>
<div id="root"></div>
<script src="/bundle.js"></script>
</body>
</html>
`;
res.send(html);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
ããã§ãAPI_URLç°å¢å€æ°ã¯ãJavaScriptã³ãŒãå
ã§window.env.API_URLãéããŠã¢ã¯ã»ã¹å¯èœã«ãªããŸãã
Import Mapsãšç°å¢å€æ°ã«ããåçã¢ãžã¥ãŒã«èšå®
æ¬åœã®åã¯ãimport mapsãšç°å¢å€æ°ãçµã¿åããããšãã«çºæ®ãããŸããç°å¢å€æ°ã䜿çšããŠãçŸåšã®ç°å¢ã«åºã¥ããŠimport mapå ã®ã¢ãžã¥ãŒã«URLãåçã«èª¿æŽã§ããŸããããã«ãããã³ãŒãã倿Žãããã¢ããªã±ãŒã·ã§ã³ãåãã«ããããããããšãªããç°ãªãã¢ãžã¥ãŒã«ããŒãžã§ã³ãAPIãšã³ããã€ã³ãããããã¯ã¢ãžã¥ãŒã«å®è£ å šäœãåãæ¿ããããšãã§ããŸãã
以äžã«äŸã瀺ããŸãã
<script type="importmap">
{
"imports": {
"api-client": "${window.env.API_CLIENT_MODULE || '/modules/api-client.js'}"
}
}
</script>
ãã®äŸã§ã¯ãapi-clientã¢ãžã¥ãŒã«ã¯API_CLIENT_MODULEç°å¢å€æ°ã§æå®ãããURLã«è§£æ±ºãããŸããç°å¢å€æ°ãèšå®ãããŠããªãå ŽåïŒäŸïŒéçºç°å¢ïŒãããã©ã«ãã§/modules/api-client.jsã«ãªããŸããããã«ããããã¹ãçšã®ã¢ãã¯APIã¯ã©ã€ã¢ã³ãããå®éã®ããã¯ãšã³ãã«æ¥ç¶ããæ¬çªAPIã¯ã©ã€ã¢ã³ããªã©ãç°ãªãç°å¢ã§ç°ãªãAPIã¯ã©ã€ã¢ã³ãå®è£
ãæãããšãã§ããŸãã
ãã®import mapãåçã«çæããã«ã¯ãéåžžããµãŒããŒãµã€ãã®ãã³ãã¬ãŒãèšèªããã«ãæã®çœ®æããŒã«ã䜿çšããŸããéèŠãªã®ã¯ãHTMLçæããã»ã¹äžã«ãã¬ãŒã¹ãã«ããŒïŒ${window.env.API_CLIENT_MODULE}ïŒãç°å¢å€æ°ã®å®éã®å€ã«çœ®ãæããããšã§ãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
1. APIãšã³ããã€ã³ãã®èšå®
ç°å¢ãç°ãªãã°ãå¿ èŠãªAPIãšã³ããã€ã³ããç°ãªãããšããããããŸããäŸãã°ãéçºç°å¢ã§ã¯ããŒã«ã«ã®APIãµãŒããŒã䜿çšããæ¬çªç°å¢ã§ã¯ã¯ã©ãŠãããŒã¹ã®APIã䜿çšãããããããŸãããimport mapsãšç°å¢å€æ°ã䜿çšããŠãAPIã¯ã©ã€ã¢ã³ããæ£ãããšã³ããã€ã³ãã䜿çšããããã«åçã«èšå®ã§ããŸãã
<script type="importmap">
{
"imports": {
"api-client": "/modules/api-client.js"
}
}
</script>
<script>
import apiClient from 'api-client';
apiClient.setBaseUrl(window.env.API_URL || 'http://localhost:3000/api');
</script>
ãã®äŸã§ã¯ãapi-clientã¢ãžã¥ãŒã«ãã€ã³ããŒãããããã®setBaseUrlã¡ãœãããAPI_URLç°å¢å€æ°ã®å€ã§åŒã³åºãããŸããããã«ãããå®è¡æã«APIãšã³ããã€ã³ããåçã«èšå®ã§ããŸãã
2. ãã£ãŒãã£ãŒãã©ã°
ãã£ãŒãã£ãŒãã©ã°ã䜿çšãããšãç°å¢ããŠãŒã¶ãŒã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®æ©èœãæå¹ãŸãã¯ç¡å¹ã«ã§ããŸããimport mapsãšç°å¢å€æ°ã䜿çšããŠããã£ãŒãã£ãŒãã©ã°ã«åºã¥ããŠç°ãªãã¢ãžã¥ãŒã«å®è£ ãåçã«èªã¿èŸŒãããšãã§ããŸãã
<script type="importmap">
{
"imports": {
"feature-module": "${window.env.FEATURE_ENABLED ? '/modules/feature-module-enabled.js' : '/modules/feature-module-disabled.js'}"
}
}
</script>
<script>
import featureModule from 'feature-module';
featureModule.run();
</script>
ãã®äŸã§ã¯ãFEATURE_ENABLEDç°å¢å€æ°ãtrueã«èšå®ãããŠããå Žåãfeature-module-enabled.jsã¢ãžã¥ãŒã«ãèªã¿èŸŒãŸããŸãããã以å€ã®å Žåã¯ãfeature-module-disabled.jsã¢ãžã¥ãŒã«ãèªã¿èŸŒãŸããŸããããã«ãããã³ãŒãã倿Žããããšãªãæ©èœãåçã«æå¹ãŸãã¯ç¡å¹ã«ã§ããŸãã
3. ããŒãèšå®ãšããŒã«ã©ã€ãº
è€æ°ã®ããŒããããŒã«ã©ã€ãŒãŒã·ã§ã³ããµããŒãããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãimport mapsã䜿çšããŠãç°å¢å€æ°ããŠãŒã¶ãŒã®å¥œã¿ã«åºã¥ããŠé©åãªããŒããããŒã«ã©ã€ãºãã¡ã€ã«ãåçã«èªã¿èŸŒãããšãã§ããŸããäŸãã°ãå€èšèªãŠã§ããµã€ãã§ã¯ãçŸåšã®ãã±ãŒã«ã瀺ãç°å¢å€æ°ã䜿çšããimport mapãæ£ãã翻蚳ãã¡ã€ã«ãåçã«æãããã«ããŸããç°ãªãé貚ãèšèªããµããŒãããã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ãããimport mapã¯ããµãŒããŒãµã€ãã§æ±ºå®ããenv倿°ãšããŠæ³šå ¥ããããŠãŒã¶ãŒã®å Žæã«åºã¥ããŠãé貚ãã©ãŒããã¿ãŒãèšèªããã¯ã解決ã§ããŸãã
4. A/Bãã¹ã
Import mapsã¯A/Bãã¹ãã«åŒ·åã§ããç°å¢å€æ°ïŒããããA/Bãã¹ããã©ãããã©ãŒã ã«ãã£ãŠèšå®ãããïŒã«åºã¥ããŠã¢ãžã¥ãŒã«ã®ç°ãªãããŒãžã§ã³ãæ¡ä»¶ä»ãã§èªã¿èŸŒãããšã«ãããç°ãªããŠãŒã¶ãŒã°ã«ãŒãã«å¯ŸããŠã³ã³ããŒãã³ããç°¡åã«äº€æã§ããŸããeã³ããŒã¹ãµã€ãã§ç°ãªããã§ãã¯ã¢ãŠããããŒããã¹ãããããšãèããŠã¿ãŠãã ãããcheckoutã¢ãžã¥ãŒã«ã®2ã€ã®ããŒãžã§ã³ãååšããimport mapã¯ãŠãŒã¶ãŒã®A/Bãã¹ãã°ã«ãŒãã«åºã¥ããŠæ£ããããŒãžã§ã³ã«åçã«è§£æ±ºãããåãããã€ãªãã§ã³ã³ããŒãžã§ã³çãåäžãããŸããããã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããªãšãŒã·ã§ã³ããã现ããå¶åŸ¡ããå¿
èŠãããå€§èŠæš¡ãªãããã€ã¡ã³ãã«ç¹ã«åœ¹ç«ã¡ãŸãã
åçã¢ãžã¥ãŒã«èšå®ã®å©ç¹
- æè»æ§ïŒ ã³ãŒãã倿Žããããšãªããã¢ããªã±ãŒã·ã§ã³ãç°ãªãç°å¢ã«ç°¡åã«é©å¿ãããããšãã§ããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒ ç°ãªã顧客ããããã€ã¹ããŒãžã«å¯ŸããŠãç°ãªãèšå®ããµããŒãã§ããŸãã
- ä¿å®æ§ïŒ ãã«ãããã»ã¹ã®è€éãã軜æžããã³ãŒãã®æ§æãæ¹åããŸãã
- ãã«ãæéã®ççž®ïŒ èšå®ã倿Žããããã³ã«ã¢ããªã±ãŒã·ã§ã³ãåãã«ãããå¿ èŠããªããªããŸãã
- ãããã€ã®ç°¡çŽ åïŒ åãã³ãŒããç°ãªãèšå®ã§è€æ°ã®ç°å¢ã«ãããã€ã§ããŸãã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- ã»ãã¥ãªãã£ïŒ ç°å¢å€æ°ãéããŠæ©å¯æ å ±ãå ¬éããªãããã«æ³šæããŠãã ãããæ©å¯ããŒã¿ã¯å®å šãªèšå®ç®¡çã·ã¹ãã ã«ä¿åããŠãã ããã
- è€éãïŒ åçãªã¢ãžã¥ãŒã«èšå®ã¯ãã¢ããªã±ãŒã·ã§ã³ã«è€éããå ããå¯èœæ§ããããŸããæ éã«äœ¿çšããèšå®æŠç¥ãæç¢ºã«ææžåããŠãã ããã
- ãã©ãŠã¶äºææ§ïŒ Import mapsã¯æ¯èŒçæ°ããæ©èœã§ããå€ããã©ãŠã¶ã«ã¯ããªãã£ã«ã䜿çšããŠãã ãããããåºç¯ãªãµããŒãã®ããã«ães-module-shimsã®ãããªããŒã«ã®äœ¿çšãæ€èšããŠãã ããã
- ãã¹ãïŒ ãµããŒããããŠãããã¹ãŠã®ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããåçãªèšå®ãæ£ããæ©èœããŠããããšã確èªããŠãã ããã
- ããã©ãŒãã³ã¹ïŒ åçãªã¢ãžã¥ãŒã«è§£æ±ºã¯ãããããªããã©ãŒãã³ã¹ãžã®åœ±é¿ãäžããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã枬å®ããå¿ èŠã«å¿ããŠæé©åããŠãã ããã
- ãã©ãŒã«ããã¯ã¡ã«ããºã ïŒ ç°å¢å€æ°ãèšå®ãããŠããªãå Žåã§ãã¢ããªã±ãŒã·ã§ã³ãæ£ããåäœããããã«ãç°å¢å€æ°ã«ã¯åžžã«ããã©ã«ãå€ãèšå®ããŠãã ããã
- ããªããŒã·ã§ã³ïŒ ç°å¢å€æ°ãæ£ãã圢åŒãšå€ãæã£ãŠããããšã確èªããããã«ãããªããŒã·ã§ã³ãè¡ã£ãŠãã ãããããã¯ãšã©ãŒãé²ããã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
- äžå åãããèšå®ïŒ ã³ãŒãããŒã¹å šäœã«ç°å¢å€æ°ã®å®çŸ©ãæ£åšãããªãã§ãã ããããã¹ãŠç°å¢å€æ°ãšãã®ããã©ã«ãå€ã管çããããã«ãäžå åãããèšå®ã¢ãžã¥ãŒã«ã䜿çšããŠãã ããã
Node.jsãšã®äºææ§
Import mapsã¯äž»ã«ãã©ãŠã¶ã®æ©èœã§ããães-module-shimsã®ãããªããã±ãŒãžã®å©ããåããŠNode.jsã§ã䜿çšã§ããŸããããã«ãããã¯ã©ã€ã¢ã³ããµã€ããšãµãŒããŒãµã€ãã®äž¡æ¹ã®ã³ãŒãã§äžè²«ããã¢ãžã¥ãŒã«è§£æ±ºæŠç¥ãç¶æã§ããã³ãŒãã®åå©çšãä¿é²ããéçºã¯ãŒã¯ãããŒãç°¡çŽ åããŸãã
// Example Node.js usage with es-module-shims
const esmsInit = require('es-module-shims').init;
esmsInit();
// Add your import map to the global scope
global.esmsDefine = globalThis.esmsDefine;
global.esmsDefine({
imports: {
'my-module': './my-module.js'
}
});
// Now you can use import statements as usual
import('my-module')
.then(module => {
module.default.doSomething();
})
.catch(err => {
console.error(err);
});
ã¢ãžã¥ãŒã«èšå®ã®æªæ¥
JavaScriptã®import mapsãšç°å¢å€æ°ã¯ãããæè»ã§åçãªã¢ãžã¥ãŒã«èšå®ã«åãã倧ããªäžæ©ã衚ããŠããŸãããããã®æè¡ãæçããããåºãæ¡çšãããã«ã€ããŠãçŸä»£ã®Webéçºã®é¢šæ¯ã«ãããŠãŸããŸãéèŠãªéšåãšãªãã§ãããããã®åŒ·åãªã¢ãããŒãã®å©ç¹ãæå€§éã«æŽ»çšããããã«ããã©ãŠã¶ã®ãµããŒããšããŒã«ã®é²æ©ã«æ³šç®ãç¶ããŠãã ããã
çµè«
JavaScriptã®import mapsãšç°å¢å€æ°ã䜿çšããåçã¢ãžã¥ãŒã«èšå®ã¯ãå®è¡æã«ã¢ãžã¥ãŒã«ã®è§£æ±ºã管çããããã®åŒ·åãªæ¹æ³ãæäŸããŸãããããã®æè¡ãçµã¿åãããããšã§ãç°ãªãç°å¢ã«å®¹æã«é©å¿ã§ãããæè»ã§ã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããçæãã¹ãããã€ãã®èæ ®äºé ã¯ãããŸããããã®ã¢ãããŒãã®å©ç¹ã¯ãçŸä»£ã®Webéçºè ã«ãšã£ãŠäŸ¡å€ã®ããããŒã«ãšãªããŸãããããã®ãã¯ããã¯ã掻çšããŠãJavaScriptãããžã§ã¯ãã§ãã倧ããªæè»æ§ãè§£ãæŸã¡ãé »ç¹ãªåãã«ãã®ãªãŒããŒããããªãã«ãããã¹ã ãŒãºãªãããã€ãA/Bãã¹ããããã³ãã£ãŒãã£ãŒãã©ã°ãå¯èœã«ããŠãã ãããå°èŠæš¡ãªãããžã§ã¯ãã«åãçµãã§ããå Žåã§ããå€§èŠæš¡ãªãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ã«åãçµãã§ããå Žåã§ããåçãªã¢ãžã¥ãŒã«èšå®ã¯éçºã¯ãŒã¯ãããŒãåçåããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã®ã«åœ¹ç«ã¡ãŸãããããã®æŠå¿µã詊ããç¹å®ã®ããŒãºã«åãããŠé©å¿ãããJavaScriptã¢ãžã¥ãŒã«ç®¡çã®æªæ¥ãåãå ¥ããŸãããã