çŸåšããã¹ãŠã®ããã±ãŒãžã®CommonJSããŒãžã§ã³ã®ã¿ãåºè·ããŠããŸãã ãã ããå°æ¥çã«ã¯ESMãšããŠåºè·ããå¯èœæ§ããããŸãïŒhttps://github.com/facebook/react/issues/10021ïŒã
åããã±ãŒãžããã®ãããã¬ãã«ã®ESãšã¯ã¹ããŒããã©ã®ããã«ãªãããå®éã«æ±ºå®ããŠããªãããããããç°¡åã«è¡ãããšã¯ã§ããŸããã ããšãã°ã react
ã¯å€æ°ã®ååä»ããšã¯ã¹ããŒãããããŸããã React
ãšããããã©ã«ãã®ãšã¯ã¹ããŒãããããŸããïŒ ããè¯ãæšã®æºãã®ããã«äººã
ã«import *
ãå§ããã¹ãã§ããïŒ çŸåšã¯ã©ã¹ããšã¯ã¹ããŒãããŠããreact-test-renderer/shallow
ã¯ã©ãã§ããïŒãããã£ãŠãããã©ã«ãã®ãšã¯ã¹ããŒãã«å€æãããå ŽåãNodeã§å€±æãå§ããŸãïŒïŒ
Imho import *
ã¯è¡ãæ¹æ³ã§ããImã¯ããã©ã«ãã®ãšã¯ã¹ããŒããå察ããŠããŸãããããã®äŸã®ããã«ä»ã®ãã®ãåãšã¯ã¹ããŒãããããã«äœ¿çšããã¹ãã§ã¯ãããŸããïŒ
export const Component = ...
export default React
React.Component = Component
ãã ãã次ã®äŸã®ããã«ãä»ã®ãã®ãåãšã¯ã¹ããŒãããããã«äœ¿çšããªãã§ãã ããã
æè¡çãªçç±ã¯ãããŸããïŒ ïŒåãããšããã2ã€ã®æ¹æ³ãããããšãé€ããŠãïŒ
ç§ã®å°è±¡ã§ã¯ã *
ãã€ã³ããŒãããïŒãããŠããã©ã«ãã䜿çšããªãïŒäººã¯ãããã©ã«ããæªäœ¿çšã®ãŸãŸã«ãªããããããªãŒã®æºãã«åé¡ã¯ãããŸããã ããããå€åç§ã¯ããŒã«ã¢ãããªã©ãé倧è©äŸ¡ããŠããŸãã
ãã®è³ªåã«ã¯ããããã@lukastaegertãæãããçããããšãã§ããŸãã https://github.com/facebook/react/issues/10021#issuecomment-335128611以éã«äœããå€æŽããããã©ããããããªã
ãŸããããŒã«ã¢ããã ããããªãŒã·ã§ãŒã«ãŒã§ã¯ãããŸãããwebpackã®ããªãŒã·ã§ãŒãã³ã°ã¢ã«ãŽãªãºã ã¯ããŒã«ã¢ããã®ã¢ã«ãŽãªãºã ãããå£ããŸããããã®äœ¿çšéã¯ããããããŒã«ã¢ãããããã¯ããã«é«ããªããŸãïŒã©ã¡ãã®ããŒã«ãåªããä»äºãããŸããç§ã¯èª°ãæãããããããŸããïŒ ãäºå®ãè¿°ã¹ãã ãã§ãïŒãããŠïŒã³ãã¥ããã£ãšããŠïŒäž¡æ¹ã®ããŒã«ãäžåºŠã«æ¯æŽã§ããã®ã§ããã°ãã§ããéãæ¯æŽããå¿ èŠããããŸãã
ãã¹ãŠãåäžã®ãã©ãããã³ãã«ã«ååŠçãããŠãããšãããšãReactã®å ŽåãããªãŒã·ã§ã€ã¯ã¯äœãã_å®è¡_ããŸããïŒ Reactã®äž»ãªã€ã³ããŒãã¹ã¿ã€ã«ã¯äœã§ããïŒå人çã«ã¯ããã©ã«ãã®ãšã¯ã¹ããŒãã®ããã«æ±ãåŸåããããŸãïŒäŸïŒ React.Component
ã React.Children
ããæã
cloneElement
ååä»ãã®ãã®ãå®è¡ããŸã
@gaearonããã§ã«ä»ã®å Žæã§è¿°ã¹ãŠããããã«ãreactã®å Žåã®ãµã€ãºã®æ¹åã¯æå°éã§ãããšäºæ³ãããŸãã ããã«ãããããããããã€ãã®å©ç¹ããããŸãã
React.Component
ãåç
§ããå¥ã®å€æ°ã¯å¿
èŠãªããã©ãã§ãå
±æãããå€æ°ã1ã€ã ãã§ãããšããäºå®ã«ãããŸãïŒããã¯éåžžãããŒã«ã¢ãããè¡ãæ¹æ³ã§ãïŒã ãŸããããã¯ç§ãæšæž¬ããŠããããšã§ãããããã«ãããwebpackã®ModuleConcatenationPluginããã€ã«ã¢ãŠãããå¯èœæ§ãäœããªãå¯èœæ§ããããŸããšã¯ã¹ããŒãã®çš®é¡ã«é¢ããŠã¯ããã¡ãããååä»ãã®ãšã¯ã¹ããŒãã ãããç°¡åãªããªãŒã·ã§ã€ã¯ã®å©ç¹ãå®éã«æäŸããŸãïŒGCCã䜿çšããªãéããGCCã䜿çšãããšãç©æ¥µçãªåãã§ããå°ãå®è¡ã§ããå¯èœæ§ããããéãè¯ããã°ææ°ã®ããŒã«ã¢ãããå¯èœã«ãªãå¯èœæ§ããããŸãïŒ ã ããã©ã«ãã®ãšã¯ã¹ããŒããæäŸãããã©ããã®è³ªåã¯ã決å®ããã®ãããå°é£ã§ãã
2ããŒãžã§ã³ã®ç§»è¡æŠç¥ãšããŠãéæšå¥šãšå®£èšãããäºææ§ã®ç®çã§æ¬¡ã®ããŒãžã§ã³ã«ããã©ã«ãã®ãšã¯ã¹ããŒããè¿œå ãïŒã²ãã¿ãŒãªã©ãä»ããŠèŠåã衚瀺ããå ŽåããããŸãïŒããã以éã®ããŒãžã§ã³ã§åé€ããããšãã§ããŸãã
ãããèå³æ·±ãã±ãŒã¹ã§ãïŒ https ïŒ
ãã®ãã€ãã¿ãŒã®äŒè©±ã§ããã«æ¥ãŸããã ç§ã«ãšã£ãŠããã®è³ªåã«å¯Ÿããæ確ãªæ£è§£ããããŸããReactãšReactDOMã¯ãååä»ãã®ãšã¯ã¹ããŒãComponent
ã createElement
ãã眮ããå ŽæãšããŠã§ãã
ïŒããã¯ãŸãããã³ãã©ãŒã®ç掻ã楜ã«ããŸãããããã¯ããã«ãããã«ããããŸãããïŒ
ãã¡ãããããã¯çŸåšããã©ã«ãã®ã€ã³ããŒããšãã©ã³ã¹ãã€ã«ã䜿çšããŠãã人ã ã«é倧ãªå€æŽããããããŸãã @lukastaegertã¯ããããããã§æ£ããèããæã£ãŠãããã¢ã¯ã»ãµã䜿çšããŠéæšå¥šã®èŠåãåºåããŸãã ãããã¯ããŒãžã§ã³17ã§åé€ãããå¯èœæ§ããããŸããïŒ
ãã ããïŒ11526ã®æ¢æã®ææ¡ã¯ãããŸããã ãããããESMã®åºè·ã¯ãã®çç±ã§v17ãåŸ ã€å¿ èŠããããŸãããã®å Žåãéæšå¥šã®èŠåã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã
人ã ã¯æ¬åœã«å¥œãã«ãªããŸãã
import React, { Component } from 'react'
ã ãã圌ãã«ããããããããããã«èª¬åŸããã®ã¯é£ãããããããŸããã
å°ãå¥åŠã ãšããŠããããã¯ããã»ã©æªãã¯ãªããšæããŸãã
import * as React from 'react';
import { Component } from 'react';
æ確ã«ããããã«ãæã
ã¯å¿
èŠReact
JSXã¯ã«transpilesã®ã§ïŒãã®å Žåã¯ãåå空éãšããŠïŒã®ç¯å²ã«ããããšãReact.createElement()
ã JSXãå£ããŠã代ããã«ã°ããŒãã«jsx()
é¢æ°ã«äŸåããŠãããšèšãããšãã§ããŸãã ãã®å Žåãã€ã³ããŒãã¯æ¬¡ã®ããã«ãªããŸãã
import {jsx, Component} from 'react';
ããã¯ãããã倧äžå€«ã§ããã倧ããªå€åã§ãã ããã¯ãReact UMDãã«ãã§ãwindow.jsx
ãèšå®ããå¿
èŠãããããšãæå³ããŸãã
jsx
代ããã«createElement
jsx
ãææ¡ããã®ã¯ãªãã§ããïŒ ãããšã createElement
ã¯ãã§ã«ãªãŒããŒããŒããããŠããïŒ document.createElement
ïŒã React.
修食åã§åé¡ãããŸããããã°ããŒãã«ã§ãããå€ããããšäž»åŒµããããšã¯ãããŸããã Tbhç§ã¯ãããã®ãªãã·ã§ã³ã®ã©ã¡ãã«ãããŸãè奮ããŠãããããããããããæè¯ã®äžéç¹ã«ãªããšæããŸãã
import * as React from 'react';
import { Component } from 'react';
JSXã¯ããã©ã«ãã§React.createElement
ãã©ã³ã¹ãã€ã«ãç¶ããŸãã
åçœïŒJSXã䜿çšããããã«React
ãæ瀺çã«ã€ã³ããŒãããå¿
èŠãããã®ã¯ãå®éã«ã¯ã©ãã§ããã®èå¥åã䜿çšããŠããªããŠãããã€ãå°ãå¥åŠã ãšæããŸããã ããããå°æ¥ããã©ã³ã¹ãã€ã©ãŒã¯ãJSXããŸã ååšããªãå ŽåãJSXã«ééãããšãã«import * as React from 'react'
ïŒPreactãªã©ã®ããã«æ§æå¯èœïŒãæ¿å
¥ããå¯èœæ§ããããŸããïŒ ããããã°ããããè¡ãã ãã§æžã¿ãŸã...
import { Component } from 'react';
...ãããŠåå空éã®ã€ã³ããŒãã¯èªåçã«åŠçãããŸãã
é ãå°æ¥ãå€åã ä»ã®ãšããããã©ã³ã¹ãã€ã©ãŒãä»ã®ã¢ãžã¥ãŒã«ã·ã¹ãã ïŒCommonJSãŸãã¯ã°ããŒãã«ïŒã§åäœããããšã確èªããå¿ èŠããããŸãã ãããæ§æå¯èœã«ããããšãããŒãã«ã§ãããã³ãã¥ããã£ãããã«åå²ããŸãã
@ Rich-Harrisãææ¡ããããšïŒjsxã䜿çšãããŠãããšãã«ç¹å®ã®ã€ã³ããŒããæ¿å
¥ããããšïŒã¯ãtranspilersãã©ã°ã€ã³ã«ãã£ãŠç°¡åã«å®è¡ã§ããŸãã ã³ãã¥ããã£ã¯babel-plugin-transform-react-jsx
ãã¢ããã°ã¬ãŒãããå¿
èŠããããããã ãã§ãã ãããŠãã¡ããããã¡ã€ã«ã«import * as React from 'react';
ãè¿œå ããã®ã1ã€ã ãã§ããã°ãæ¢åã®ã»ããã¢ããã§ãæ©èœããŸãã
ãã¡ãããä»ã®ã¢ãžã¥ãŒã«ã·ã¹ãã ãæ€èšããå¿ èŠããããŸããã解決ããã®ã¯é£ããåé¡ã§ã¯ãªãããã§ãã ç¹å®ã®èœãšãç©Žã念é ã«çœ®ããŠããŸããïŒ
ãã¡ãããä»ã®ã¢ãžã¥ãŒã«ã·ã¹ãã ãæ€èšããå¿ èŠããããŸããã解決ããã®ã¯é£ããåé¡ã§ã¯ãªãããã§ãã ç¹å®ã®èœãšãç©Žã念é ã«çœ®ããŠããŸããïŒ
ããããŸãããããããã©ã®ããã«åŠçãããã«ã€ããŠã®ããªãã®å ·äœçãªææ¡ã¯äœã§ããïŒ Babel JSXãã©ã°ã€ã³ã®ããã©ã«ãã¯äœã§ããïŒ
人ã ã¯æ¬åœã«å¥œãã«ãªããŸãã
import React, { Component } from 'react'
ã©ã®ãããªäººã ïŒ ç§ãããªããããããããã«åºãŠæ¥ãªããã
ç§ã¯ãããããããããŸããðç§ã¯ä»ã®å Žæã§ããããèŠãããšããããšç¢ºä¿¡ããŠããŸãã
ããã©ã«ãã¯çŸæç¹ã§ã¯React.createElement
ãã»ãšãã©åãã§ãã å¯äžã®åé¡ã¯ãçŸåšã°ããŒãã«ãæ³å®ããŠããïŒãŸãã¯ã¹ã³ãŒãã§ãã§ã«äœ¿çšå¯èœã«ãªã£ãŠããïŒããšã§ãã
esã¢ãžã¥ãŒã«ã¯åºæ¬çã«ïŒãŸã ãã¹ãŠã«æ¡çšãããŠããããã§ã¯ãããŸãããïŒã¢ãžã¥ãŒã«ãå®è¡ããæšæºçãªæ¹æ³ã§ããããã倧å€æ°ãããã䜿çšããïŒãŸãã¯äœ¿çšããå¿
èŠãããïŒãšæ³å®ããã®ã劥åœã ãšæããŸãã 倧å€æ°ã¯ãã§ã«ããŸããŸãªãã«ãã¹ãããããŒã«ã䜿çšããŠãã³ãã«ãäœæããŠããŸããåœãŠã¯ãŸããŸãã jsxãã©ã°ã€ã³ã®ããã©ã«ãã®åäœãã¹ã³ãŒããžã®React.createElement
èªåæ¿å
¥ã«å€æŽããããšã¯ãåççãªæ¹æ³ã§ãã ç§ãã¡ã¯ãã®å€æŽã«æé©ãªææã«ããã babel @ 7ãéããªãç»å ŽããŸãïŒ-ishïŒã æè¿babel-helper-module-imports
è¿œå ãããããšã§ãæ£ããã¿ã€ãã®ã€ã³ããŒãïŒes / cjsïŒããã¡ã€ã«ã«æ¿å
¥ããããšããããŸã§ã«ãªãç°¡åã«ãªããŸããã
ãããä»æ¥ã®åäœïŒã¹ã³ãŒãå ã«ååšãããšä»®å®ïŒã«å¯Ÿå¿ããããã«æ§æã§ããããã«ããããšã¯ãå°æ°ã®ãŠãŒã¶ãŒã«å¿ èŠãªæ§æã®å°ããªå€æŽãšã倧å€æ°ã®ãŠãŒã¶ãŒã®æ¹åïŒç¢ºãã«ã倧ããªãã®ã§ã¯ãããŸããããããã§ãïŒã®ããã«èŠããŸãã
ããè¯ãæšã®æºãã®ããã«*ãèŒžå ¥ãããã人ã ã«å§ããã¹ãã§ããïŒ
@alexlamslã®ãããã§ã uglify-es
ã¯ãäžè¬çãªã·ããªãªã§ã®export default
ããã«ãã£ãæé€ããŸããã
$ cat mod.js
export default {
foo: 1,
bar: 2,
square: (x) => x * x,
cube: (x) => x * x * x,
};
$ cat main.js
import mod from './mod.js'
console.log(mod.foo, mod.cube(mod.bar));
md5-d6d4ede42fc8d7f66e23b62d7795acb9
$ uglifyjs -V
uglify-es 3.2.1
```js
$ cat bundle.js | uglifyjs --toplevel -bc
var mod_foo = 1, mod_bar = 2, mod_cube = x => x * x * x;
console.log(mod_foo, mod_cube(mod_bar));
$ cat bundle.js | uglifyjs --toplevel -mc passes=3
console.log(1,8);
ãããŒãããã¯çŽ æŽãããæ°ããã§ãð uglify-es
ã¯ä»å®å®ããŠãããšèããããŠããŸããïŒ æ°ã¶æåã«ãŸã ããã«ãªããšããããšããã£ããã£ãŠããã®ãèŠããŠããŸãããããã¯ééã£ãŠèŠããŠããã®ã§ãããããããŸããã
ãšã«ãããããã¯ããŒã«ã¢ããã®äžçã§ã¯ãã¹ãŠçŽ æŽãããããšã§ããã React
ã¯äž»ã«ã¢ããªã«ãã³ãã«ãããŠããããããã¯äž»ã«webpack
ã䜿çšããŠããããšãèãããšãããã©ã«ãã§ã¯ã¹ã³ãŒãã®åŒãäžãã¯è¡ãããŸããããªããžã§ã¯ããããã©ã«ããšããŠãšã¯ã¹ããŒãããããšã¯ããã³ãã«ãµã€ãºãå°ããããããã®uglisy-es
+ rollup
以å€ã®ããŒã«ãæ¯æŽããããã«é¿ããå¿
èŠããããŸãã ãŸããç§ã«ãšã£ãŠã¯ããããåé¿ããæ¹ãæå³çã«åªããŠããŸãããã®ãããªå Žåã«libsãå®éã«è¡ãããšã¯ãåå空éãæäŸããããšã§ããã import * as Namespace from 'namespace'
ã䜿çšãããšããé©åã«è¡šçŸãããŸãã
uglify-esã¯çŸåšå®å®ããŠãããšèŠãªãããŠããŸããïŒ
JSãšã³ã·ã¹ãã ã®ä»ã®äœãããå®å®ããŠããŸãã é±ã«50äžå以äžã®ããŠã³ããŒãã
ããŒã«ã¢ããã®äžçã§ã¯ããã§ãã¹ãŠã§ãããReactã¯äž»ã«ã¢ããªã«ãã³ãã«ãããŠãããããã©ã«ãã§ã¯ã¹ã³ãŒãã®åŒãäžããè¡ããªãWebpackãäž»ã«äœ¿çšããŠããããšãèãããš
ãšã«ãããããã¯ãªãã·ã§ã³ã§ãã ãšã«ããWebpackã®ããã©ã«ãã¯çæ³çã§ã¯ãããŸãã-ãåç¥ã®ããã«ModuleConcatenationPlugin
ã䜿çšããå¿
èŠããããŸãã
ããã«æ°ã»ã³ããè¿œå ããŸãïŒ
import React from 'react'
ãŸãã¯import * as React from 'react'
ã©ã¡ããæ¬åœã«å¥œãã§ã¯ãããŸããã ç§ã®ç®ã«ã¯ããã®èšèšã¯ã createElement
éšåã䜿çšã§ããããã«ããããã ãã«ããŠãŒã¶ãŒã«Reactã®ãã¹ãŠãã€ã³ããŒãããããã«åŒ·å¶ãããšããç¹ã§ãã€ã³ã¿ãŒãã§ã€ã¹åé¢ã®ååã«æããã«éåããŠããŸãïŒãã ããåå空éã®ãšã¯ã¹ããŒãã§ã¯ãRollupã®ãããªãã³ãã©ãŒã¯äžèŠãªãšã¯ã¹ããŒããå床åé€ããŸãïŒãããã£ãŠãé倧ãªå€æŽã決å®ããå¯èœæ§ãããå Žåã¯ãJSXãåäžã®ïŒã°ããŒãã«ãŸãã¯ã€ã³ããŒããããïŒé¢æ°ã«äŸåããããã«ãããå€æŽããããšããå§ãããŸãã ç§ã¯ãããcreateJSXElement()
ãšåŒãã§ããã§ãããããããã¯ç§ã®æèŠã§ã¯createElement()
ãããããã«åªããŠãããæå³ããªãããã«Reactã³ã³ããã¹ããå¿
èŠãšããªããªããŸããã ãããããã¹ãŠã®ãã€ããéèŠãªäžçã§ã¯ã jsx()
ãããããåé¡ãããŸããã
ããã¯ãŸããä»ã®ã©ã€ãã©ãªãåãå€æã䜿çšããç°ãªãjsx
é¢æ°ãæäŸããããšã«ãã£ãŠãJSXããµããŒãããããšãéžæã§ããããã«ãæçµçã«JSXãReactããåãé¢ããŸãã ãã¡ãããããã§ã¯ãã®ãããªå€æãéããŠç¡æ°ã®ç¢ºç«ãããã¢ããªã±ãŒã·ã§ã³ãå°ãå€ãã®è²¬ä»»ããããŸãããã¢ãŒããã¯ãã£ã®èŠ³ç¹ãããããã¯ReactãšJSXãåããã¹ããšããã ãšæããŸãã Babelã䜿çšããŠãã®ãããªå€æã倧å¹
ã«åŒ·åããããšã¯ãç§ã«ãšã£ãŠçŽ æŽãããã¢ã€ãã¢ã®ããã«æããŸãã
å人çã«ã¯ã jsx
ãã«ããŒã«ç§»è¡ããŠãããŸãã¡ãªããã¯ãããŸãããããã¯ãbabelãã©ã°ã€ã³ã®ããã©ã«ãã®IMHOãreact
ããã±ãŒãžããã€ã³ããŒãããå¿
èŠããããããå®éã®ãã«ããŒã®ååã¯å®éã«ã¯ããã§ã¯ãªãããã§ããåé¡-æ®ãã¯ãæ§æå¯èœã«ããããšã ãã§ãã
ããã¯ããããã¡ã€ã³ã®è°è«ã«å°ãæ¥ããŠããŸãããESã¢ãžã¥ãŒã«ãprocess.env.NODE_ENV
ããã§ãã¯ããŠdev / prodãã³ãã«ãæ¡ä»¶ä»ãã§ãšã¯ã¹ããŒãããã®ã«ã©ãã ãããŸãæ©èœããã®ãèå³ããããŸããïŒ äŸãã°ã
ããã§æãããªäœããæ¬ ããŠãããããããŸãããããã®ãã¿ãŒã³ãESã¢ãžã¥ãŒã«ã«å€æããæ¹æ³ãèŠã€ããã®ã«èŠåŽããŠããŸããïŒ
@NMinhNguyenESã¢ãžã¥ãŒã«ã§ã¯æ¡ä»¶ä»ããšã¯ã¹ããŒãã¯ã§ããŸããã
process.env.NODE_ENV
ãã§ãã¯ã¯ããã詳现ãªïŒã³ãŒãïŒã¬ãã«ã«ããããšãã§ããŸãããé©åãªå€ãæã€ãã³ãã©ãŒã§çœ®ãæããæºåãã§ããŠããŸãã
@ Andarist @ milesjç§ã®çãã確èªããŠãããŠããããšã:)
process.env.NODE_ENV
ãã§ãã¯ã¯ããã詳现ãªïŒã³ãŒãïŒã¬ãã«ã«ããããšãã§ããŸãããé©åãªå€ãæã€ãã³ãã©ãŒã§çœ®ãæããæºåãã§ããŠããŸãã
React 16ã®ããã°æçš¿ããã process.env.NODE_ENV
å°åæã¯æå³çã«äžçªäžã«åŒãåºããããšæããŸããïŒç§ãééã£ãŠããªããã°ããããããœãŒã¹ã«ãããã®ã§ããããããã现ãããã®ãšã¯å¯Ÿç
§çã§ãïŒ ïŒãNode.jsã®ããã©ãŒãã³ã¹ãåäžãããããã«ïŒ
ãµãŒããŒåŽã®ã¬ã³ããªã³ã°ã®æ¹å
React 16ã«ã¯ãå®å šã«æžãçŽããããµãŒããŒã¬ã³ãã©ãŒãå«ãŸããŠããŸãã æ¬åœã«éãã§ãã ã¹ããªãŒãã³ã°ããµããŒãããŠãããããã¯ã©ã€ã¢ã³ããžã®ãã€ãéä¿¡ãããé«éã«éå§ã§ããŸãã ãããŠã
process.env
ãã§ãã¯ãã³ã³ãã€ã«ããæ°ããããã±ãŒãžæŠç¥ã®ãããã§ïŒä¿¡ããããªããããããŸããããNodeã§process.env
ãèªã¿åãã®ã¯æ¬åœã«é ãã§ãïŒïŒãåªãããµãŒããŒãååŸããããã«Reactããã³ãã«ããå¿ èŠã¯ãããŸãã-ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã
åæ§ã«ã package.json
ã®module
ãã£ãŒã«ãã䜿çšããŠãESãã³ãã«ããã©ããã«ä¿ã¡ãNode.jsã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããã«ãESMã®dev / prodãåºå¥ããæ¹æ³ãããããŸããã
åæ§ã«ãpackage.jsonã®ã¢ãžã¥ãŒã«ãã£ãŒã«ãã䜿çšããŠãESãã³ãã«ããã©ããã«ä¿ã¡ãNode.jsã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããã«ãESMã®dev / prodãåºå¥ããæ¹æ³ãããããŸããã
çŸæç¹ã§ã¯ãããè¡ãããã®æšæºçãªæ¹æ³ããªããããããã¯ç¢ºãã«æ¬ ç¹ã§ãã OTOHããã¯åãªãããŒã«ã®åé¡ã§ãããä»æ¥ã§ãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãã¹ãããã§ãããã³ã³ãã€ã«ããããšã¯å¯èœã§ãïŒãããŠããã¯ããªãç°¡åã§ãïŒã å€ãã®å Žåãããã±ãŒãžãdev / prodãã«ããå ¬éãããªãŸã«ããŒãã©ã¡ããéžæããããç¥ã£ãŠãããšç°¡åã§ãããããã¯ãã®ã¢ã€ãã¢ãããŒã«ã®äœæè ã«ããã·ã¥ããã ãã®åé¡ãããããŸããã
ææ¥ã®ããã«ïŒ
import Component from 'react/Component'
class MyButton extends Component{
constructor(){
this.state = {}
}
render() {
return <button> Button <Button>
}
}
ããã§ãtransformã¯super.createElementïŒïŒã䜿çšããŠjsxã«å€æããããéçComponent.createElementïŒïŒã䜿çšããŸãã
ã¹ããŒãã¬ã¹ã³ã³ããŒãã³ãã®å ŽåïŒ
import jsx from 'react/jsx'
const MyButton = () => jsx`<button> Button <Button>`;
ã¿ã°ä»ããã³ãã¬ãŒããªãã©ã«ã䜿çšããããšã¯ããããå¯èœã§ããïŒ
ããŒãã¯ããŸãããã°ãã®PRãåãå ¥ããŸãhttps://github.com/nodejs/node/pull/18392
ããã§@ Rich-Harrisã«åæããŸãã
ç¹ã«èšåãããŠããªããã®ã¹ã¬ããã«ã³ã¡ã³ããããããããã ãã§ãã
ç§ã¯ãã³ãã©ãŒããŸã£ãã䜿çšããŠãããããã©ãŠã¶ãŒïŒ <script type="module" src="...">
ïŒãä»ããŠãã€ãã£ãã«äœ¿çšããããã«reactãšããŸããŸãªã³ã³ããŒãã³ããã€ã³ããŒãããããšããç¶æ³ã«ãããŸãã
import React from âhttps://unpkg.com/[email protected]/umd/react.development.jsâ;
import ReactDOM from âhttps://unpkg.com/[email protected]/umd/react-dom.development.jsâ;
ReactDOM.render(
React.createElement(...),
document.getElementById('root')
);
ç§ã®ç¥ãéããããã¯ä»æ¥ã§ã¯äžå¯èœã§ãã 代ããã«ãCDNããã®<script>
ã¿ã°ãä»ããŠåå¿ã®UMDããŒãžã§ã³ãå«ãã次ã«ãç§ãäœæãã<script type="module">
ã¢ãžã¥ãŒã«ã®ãŠã£ã³ããŠã«ååšãããšæ³å®ããå¿
èŠããããŸãã
// myPage.html
<div id="myComponentRoot"></div>
<script src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script type="module" src="/assets/scripts/components/MyComponent.js"></script>
// MyComponent.js
import AnotherComponent from "/assets/scripts/components/AnotherComponent.js";
window.ReactDOM.render(
window.React.createElement(AnotherComponent),
document.getElementById('root')
);
// AnotherComponent.js
export default class AnotherComponent extends window.React.Component {...}
CDNããreactã€ã³ããŒããè¡ãã®ã¯çŽ æŽãããããšã§ãã ããã«ããããã¡ã€ã«ã®åé¢ãç¶æããªããããã©ãŠã¶ãŒã§ã®ãããã¿ã€ãã³ã°ãéåžžã«è¿ éãã€ç°¡åã«ãªããŸãã ãã³ãã©ãŒãªãã§Reactã䜿çšãããšãã«ç ç²ã«ãªã£ãŠãããšãã€ãæããŠããã®ã¯ãã³ã³ããŒãã³ãïŒããã³ãã®ä»ã®ãŠãŒãã£ãªãã£æ©èœãªã©ïŒããã¡ã€ã«ããšã«åé¢ã§ããããšã§ããã ãããããã€ãã£ãESã¢ãžã¥ãŒã«ã®ãã©ãŠã¶ãŒãµããŒãã«ãããReactã³ã³ããŒãã³ããå¥ã ã®ãã¡ã€ã«ã«èšè¿°ãããã©ãŠã¶ãŒã«èšè¿°ããããšããã«ããããæ¶è²»ãããããšãã§ããŸãã 確ãã«ãJSXã䜿çšããŠããªãå Žåã§ããJSXã䜿çšããŠããå Žåã§ãããã«ãã¹ããããä»ããŠãã¹ãŠã®ãã¡ã€ã«ãé 眮ã§ãããã¹ãŠã®ã€ã³ããŒãã¯ãã©ãŠã¶ãŒã§æ©èœããŸãã
// /assets/scripts/entry.js
import React from âhttps://unpkg.com/[email protected]/umd/react.development.jsâ;
import React from âhttps://unpkg.com/[email protected]/umd/react-dom.development.jsâ;
import RelatedPosts from "/assets/scripts/components/RelatedPosts.js";
ReactDOM.render(
React.createElement(RelatedPosts),
document.getElementById('root')
);
// /assets/scripts/components/RelatedPosts.js
import React from âhttps://unpkg.com/[email protected]/umd/react.development.jsâ;
import ListItem from "/assets/scripts/components/ListItem.js"
export default class MyComponent extends React.Component {
componentDidMount() { /* fetch some data */ }
render() {
return React.createElement(
'ul',
{},
this.state.items.map(item => React.createElement(ListItem, { item: item })
)
}
}
// /assets/scripts/components/ListItem.js
import React from âhttps://unpkg.com/[email protected]/umd/react.development.jsâ;
export default function ListItem(props) {
return React.createElement('li', null, ...)
}
CDN URLãåžžã«å ¥åããããšã¯åé¡ïŒäžéšã®äººãä¿®æ£ããããšããŠããåé¡ïŒã§ãããšäž»åŒµãã人ããããšæããŸããããã¬ãŒããªãã¯ç§ã«ãšã£ãŠäŸ¡å€ããããŸãã ãã®URLã®å€æŽ/æŽæ°ã¯ãç°¡åãªæ€çŽ¢/眮æã§ãã ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãããã¯ãã³ãã©ãŒãèšå®ããæéãäžåããŸãã
Reactããã®ãããªãã®ããµããŒãããŠããã°ãããŒã«ã¯å¿ èŠãããŸããã ç§ã¯ãã©ãŠã¶ã䜿çšããŠããŸãã ãã®ãããªã³ãŒãã¯ãææ°ã®ãã©ãŠã¶ãŒãæ³å®ããããŒãžã®ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããšããŠreactã䜿çšããããã€ãã®å人çãªãããžã§ã¯ãã§åºè·ã§ããŸãã ãããçŽ æŽããããã®ã«ããŠããã®ã¯ã12ãæåŸã«ã³ãŒãããŒã¹ã«æ»ã£ããšãã«ãå€æ°ã®ããŒã«APIãå€æŽããããããã±ãŒãžãããŒãžã£ãŒãšããŠNPMã䜿çšãããããå¿ èŠããªãããšã§ãã ç§ã¯ãã©ãŠã¶ããAPIã䜿çšããŠããã ãã§ãä»ã«ã¯äœã䜿çšããŠããŸããã
FWIWïŒReactããã®ãããªãµããŒãã§åºè·ãããå Žåãããã¥ã¡ã³ãã§ãã®ããã«Reactã䜿çšããæ¹æ³ã瀺ããReactãšãã®ã³ã³ããŒãã³ãã¢ãã«ããåã³ã³ããŒãã³ãããžãã¯ãåé¢ããããšã§æŽ»çš<script type="module">
䜿çšããCDNïŒãŸãã¯ç¬èªã®ããŒã«ã«ã³ããŒïŒããReactãã€ã³ããŒãããŠããªãã«ããŸããã
çŸåšãã¢ãã€ã«ããŒãžã§ã³ãå«ãææ°ã®ãã©ãŠã¶ã¯ãã¹ãŠESMããµããŒãããŠããŸãã ESMã¯ãå°æ¥ã®ã¢ãžã¥ãŒã«ã·ã¹ãã ã§ã¯ãªããçŸåšã®ããã¡ã¯ãã¹ã¿ã³ããŒãã§ãã
æšæºåãããã¢ãžã¥ãŒã«ãæäŸããªãããšã¯ãç¹ã«ããã¡ã¯ãã¹ã¿ã³ããŒãã®Webã©ã€ãã©ãªã«ãšã£ãŠé倧ãªåé¡ã§ããããšã«æ³šæããŠãã ããã
import * as React from 'react';
import * as ReactDOM from 'react-dom';
ããã¯Reactã©ã€ãã©ãªãé©çšããããã®å žåçãªã³ãŒãã§ãããå®éã«ã€ã³ããŒãã§ããã©ã€ãã©ãªã¯ãããŸããã代ããã«ããµãŒãããŒãã£ã®ãã©ã³ã¹ãã€ã©ãŒãšãã³ãã©ãŒãã€ã³ããŒãããã»ã¹ããšãã¥ã¬ãŒãããŸãã
ãã©ãŠã¶ããã€ãã£ãESMããµããŒãããŠããªãã£ããããå®éã®ESMãæäŸããªãããšã¯å°ãæ£åœåãããŸããããæããã«æéã¯éããŠãããå
žåçãªãµã³ãã«ã³ãŒããimport
æå®ããESMãæäŸããæãæ¥ãŸããã
@TrySoundã
ESMãã«ããååŸããŠãã¹ãããå Žæã¯ãããŸããïŒ
ããã¯react-isããã±ãŒãžã®æºåãã§ããŠããŸãã
@TrySound
ããããŸãããããªãã®ãã©ã³ãhttps://github.com/TrySound/react/tree/react-is-esmãèŠã€ããŠãã«ãããŸãããããã§ãããªãã®æå³ãããããŸããã react-dom
ã楜ãã¿ã«ããŠããŸãã
Reactã³ãã¥ããã£ã¯ãã®åé¡ã«ã€ããŠããªãé·ãéè°è«ããŠãããšæããŸãã
https://discuss.reactjs.org/t/es6-import-as-react-vs-import-react/360/
å ¬åŒã®ES6ã¢ãžã¥ãŒã«ä»æ§ã決å®ããããã«å ¬éããŠãã ããã
@kenokabeéäžã§ãã ç¡çã«æŒã蟌ãŸãªãã§ãã ããã ããã»ã©ç°¡åã§ã¯ãããŸããã
çŸåšã®èšç»ã§ã¯ãååä»ããšã¯ã¹ããŒãã®ã¿ãå«ããã¹ãŠã®ããã±ãŒãžã移è¡ããŠããŸãã ãã®å€æŽã¯ã©ã€ãã©ãªã³ãŒãã«åœ±é¿ãäžãããããã¥ã¡ã³ããååä»ããšã¯ã¹ããŒãã䜿çšãããããé倧ãªå€æŽãå°å ¥ããã¹ãã§ã¯ãããŸããã
å¥ã®ããã±ãŒãžã§ã¯ãããŸããŸãªããŒã«ã§ç°ãªãåäœãããããã©ã«ãã®ãšã¯ã¹ããŒããšååä»ãã®ãšã¯ã¹ããŒãã®äž¡æ¹ãåŠçããå¿ èŠããããŸãã
@TrySoundãè©«ã³ç³ãäžããŸãã
ãã®ãããã¯ã®é ã®èšåã¯
åããã±ãŒãžããã®ãããã¬ãã«ã®ESãšã¯ã¹ããŒããã©ã®ããã«ãªãããå®éã«æ±ºå®ããŠããªãããããããç°¡åã«è¡ãããšã¯ã§ããŸããã ããšãã°ãreactã«ã¯å€æ°ã®ååä»ããšã¯ã¹ããŒãããããŸãããReactãšããããã©ã«ãã®ãšã¯ã¹ããŒãããããŸããïŒ ããè¯ãæšã®æºãã®ããã«*ãèŒžå ¥ãããã人ã ã«å§ããã¹ãã§ããïŒ
ãããŠãèšåãããæ¥ã¯å°ãåã§ãããReactã³ãã¥ããã£ã§è°è«ãããŠãããšæã£ãŠããã®ã§ã決å®ãæ確ã«ãªãããšãææ¡ããããšæããŸããã ããããšãïŒ
ããã«é¢ããããã€ãã®æŽæ°ãååŸããã...
ã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã«ã«webpackv4ã䜿çšããŠããŸãããIDEã€ã³ããªã»ã³ã¹ïŒWebStormïŒã¯ãã³ãŒãã¬ãã¥ãŒã§ååããimport React from 'react';
ãå€æŽããããã«æ±ããããŠãããšãã«ã import * as React from 'react';
ã䜿çšããããã«ææ¡ããŠããŸãã ã©ã¡ããããŸãããã®ã§ã圌ã¯ãã³ã»ã³ã¹ãèšã£ãŠãããšæããŸãããã圌ã幞ãã«ããããã«ããšã«ãããããå€æŽããŠããŸãã ããã¯ç§ããã®ã¹ã¬ãããèŠã€ããæ¹æ³ã§ããããŸãã
äžæè°ã§ã¯ãããŸããããæçµçãªãã«ããµã€ãºã§ã®éããæ¯èŒããŸãïŒReact 16.8.1ã䜿çšïŒã
import * as React from 'react';
ïŒ6,618,723ãã€ã
import React from 'react';
ïŒ6,619,077ãã€ã
æããã«ãããã¯ããããªéãã¯ãããŸãããã ïŒæ³šã propTypes
ã§ãåãããšãããŸããïŒ
ãã®ã¹ã¬ããã§ã®ç§ã®ç解ãæ£ãããã°ã import * as React from 'react';
ãæã£ãŠããæ¹ãããã§ãããïŒïŒ ïŒ1ïŒã¯ããããçšåºŠã®ãµã€ãºãç¯çŽã§ããŸããã ïŒ2ïŒESMã¯æšæºåãããæ¹æ³ã§ãããããCJSã®æ®ãç©ã¯ãããããŸããã ãã®å Žåã¯ãä»æ¥ãããå€æŽããŠIDEã«åãããããšæããŸãã
@leoylié·æçã«ã¯ããã§ãã ãã ããæåã«ãæ¢åã®ã³ãŒããå£ããªãããã«ãååä»ããšã¯ã¹ããŒããšããã©ã«ããšã¯ã¹ããŒãã®äž¡æ¹ããããŸãã
ç§ã¯ããã§åé¡ãèªåã®æã«åããŸããããããžã§ã¯ãã§ãã³ãã©ãŒã䜿çšããŠããããreactïŒVueãHyperappãªã©ã®ä»ã®ã©ã€ãã©ãªã§äœ¿çšã§ããããã«unpkg.comããçŽæ¥ïŒã䜿çšãããã£ãã®ã§ãå®éšãšããŠäœ¿çšããŸããã ã ããã¯ç§ãæãã€ãããã®ã§ããã掟æãªãã®ã§ã¯ãªããæäœæ¥ã§ç·šéããããã®ã§ãã
https://github.com/lukejacksonn/es-react
React
ããã³ReactDOM
ã®ææ°ããŒãžã§ã³ãå ¬éããES6ã¢ãžã¥ãŒã«
READMEã§èª¬æãããŠããããã«ãããã¯ã»ãšãã©POCã§ããããã®ãã«ããçéžããã®ãåŸ
ã€ããšãã§ããªã人ã«ãšã£ãŠã¯ãããã¯ããµã¹ãã³ã¹ãã¬ã€ãžãŒãªã©ãå«ã16.8.3
ãã«ãã§ããã次ã®ããã«ããŠæåŸ
ã©ããã«æ©èœããŸãã
import { React, ReactDOM } from 'https://unpkg.com/es-react'
ãã¶ãããã®ã¹ã¬ããã®äœäººãã¯ããã圹ã«ç«ã€ãšæãã§ããã..å人çã«ç§ã¯ãã®ã¢ãããŒãã䜿ã£ãŠãã«ãã¹ãããã®ãªãreactã¹ã¿ãŒã¿ãŒãããžã§ã¯ããäœæããŠã
@lukejacksonnæ¬çªç°å¢ã§ããã®ãããªãœãªã¥ãŒã·ã§ã³ã䜿çšããŠããŸãããçŸåšã®ãããžã§ã¯ãã§ã¯ãUMDããŒãžã§ã³ã®Reactããã³ReactDOMã®ãã©ã³ã¹ãã©ãŒããŒã¹ã¯ãªããã§ãããšããæå³ã§ãã¢ãããŒããç°ãªããŸãã ãããŠãããã¯ãããã®ãã¡ã€ã«ãå¥ã ã«åºåããã®ã§ãããã«ããã»ãšãã©ã®ã³ãŒãã§ã¯ã眮ãæããããããããã¯ãã§ãã https://github.com/wearespindle/react-ecmascriptã«èå³ããããunpkghttps ïŒ //unpkg.com/react-ecmascript/ããããŒãããããšãã§ã
@ PM5544ãããããã..ããã¯ç§ã®ãã®ãããã¯ããã«å æ¬çãªãœãªã¥ãŒã·ã§ã³ã§ãïŒ çŽ æŽãããä»äºð¯
çŽ æŽããããã®@ PM5544ã ãã€ãããã«ã€ããŠãã£ãšèãããã§ãã ãã¶ããXebiaã«æ»ã£ãŠã²ã¹ãåºæŒïŒ
æè¿ãUNPKGããµããŒããããªãŒãã³ãœãŒã¹ããã±ãŒãžããã³ãã«ããããã«ããã¯ãæ¡çšããŸããã
ãã³ãã©ãŒã䜿çšããã®ã§ã¯ãªããUNPKGããçŽæ¥äŸåé¢ä¿ãããŒãããããšã«é¢ããè¯ãèšäºãç¥ã£ãŠãã人ã¯ããŸããïŒ
ç§ã¯çŸåš1ã€æžããŠããŸããã6æã®ReactNorwayã§ãè¬æŒããäºå®ã§ãã
@TrySound 2æ以éãããã«é¢ããæŽæ°ã¯ãããŸããïŒ ãã®åé¡ã解決ããããã«æ®ãããŠããããšã¯äœã§ããïŒã³ãŒãã£ã³ã°äœæ¥ã«ãã£ãŠãã®åé¡ã解決ããããšã«åå ã§ããŸããïŒ ç§ã¯ãã§ã«CAã«çœ²åããŠãããä»æ¥ã¯ããã«åãçµãæéããããŸãã
ããã¯æåã«ããŒãžããå¿ èŠããããŸãhttps://github.com/facebook/react/pull/15037
@TrySoundããããŸããããã®ã¹ã¬ãããžã®æ¯æŽã®ç³ãåºã転éããŸããã
ããã©ã«ãã®Reactãšã¯ã¹ããŒãã䜿çšããå Žåã¯ã次ã®æ¹æ³ã䜿çšã§ããŸãã
// react/index.js
import * as React from "./react";
export { React as default }
export * from "./react";
// react/react.js
export function createElement() {}
...
ããã«ãããããã©ã«ãã®ãšã¯ã¹ããŒããåå空éãªããžã§ã¯ãã§ããããšãéçã«åæå¯èœã«ãªããwebpack5ããã³ããŒã«ã¢ããã§ãããã®æ§æã®ããªãŒã·ã§ã€ã¯ãå¯èœã«ãªããŸãã
import React from "react";
React.createElement(); // <- only `createElement` export is used
ããŒã«ã¢ããã¯ããããšãŠãæ°ã«å ¥ã£ãŠãããã§ããã
ç§ã¯1ã5幎éããŒã«ã¢ããã®ãã¿ãŒãã£ããã«åå ããŠããŸããããã®çš®ã®åé¡ã¯2é±éããšã«çºçããŸã...
ãšããã§ã @ lukejacksonnã¯éå ¬åŒã®es-reactãã©ãŒã¯ã§çŽ æŽãããä»äºãããŸãããããã匷ããå§ãã§ããŸãã
ãšããã§ã @ lukejacksonnã¯éå ¬åŒã®es-reactãã©ãŒã¯ã§çŽ æŽãããä»äºãããŸãããããã匷ããå§ãã§ããŸãã
ãªãå ¬åŒFBããŒã ã¯ããã«äœãããªãã®ã ãããã
ç§ã¯ãŸãããããç©äºãåé²ãããããã®ãã¬ãã·ã£ãŒãçã¿åºãããšãæãã§ããŸããããããŠç§ã¯@lukejacksonnèªèº«ãããã ã£ããšæããŸãã ããããç§ãç解ããŠããããã«ã圌ã¯å®éã«ReactããŒã ããå ã®ãœãŒã¹ãããã©ãŒã¯ãæ§ç¯ããããã®ãµããŒããåããŠããã®ã§ãããã«ã¯å°ãªããšãããçšåºŠã®é¢å¿ãããããã§ãã
ç§ããããæ¬åœã«æãã§ããŸããã å®éãç§ã¯ããã±ãŒãžã®äœæã«ãããŠåå¿ããŒã ããã»ãšãã©ãµããŒããåããŠããŸããã§ããïŒ@threepointoneããã®ããã€ãã®èŠªåãªå±ãŸãã®èšèãé€ããŠïŒã æè¿ãããFormidableã®ååããããã°ã©ã ã§ããã±ãŒãžãäœæããã®ãæäŒã£ãŠãããŸãããããã¯ãreactã®æ°ããããŒãžã§ã³ããªãªãŒã¹ããããã³ã«æåã§è¡ããããæ¹åãããŠããŸããã[ãããã¯ãŒã¯]ã¿ãã®åºåãå€§å¹ ã«äœäžããããããããè¡ããããã©ããã¯ããããŸããããŸã ãã®ãŸãŸã§ãã æã ã¯èŠãã§ãããïŒ
ãã2020幎ã«ãªããŸãããå ¬åŒFBããŒã ããã®ã¢ããããŒãã¯ãããŸããïŒ React v17ã§ããã«é¢é£ããå€æŽã¯ãããŸããïŒ
æŽæ°ãããESã¢ãžã¥ãŒã«ReactNOWãå¿
èŠãªå Žåã¯ããã§ã«v16.13.xã«ãã@pica/react
ãè©ŠããŠãã ããã
https://www.npmjs.com/package/@pika/react
https://www.npmjs.com/package/@pika/react -dom
https://github.com/pikapkg/react
é ãå°æ¥ãå€åã
ããããŸããããã§ã«å°æ¥ã§ãã è¿ãå°æ¥ã§ããïŒ
@gaearonãšã¯ã¹ããŒããæ§é åããæ¹æ³ïŒããã©ã«ãã®ãšã¯ã¹ããŒããšååä»ãã®ãšã¯ã¹ããŒãïŒã決å®ããããã®ãããã«ãŒã¯äœã§ããïŒ ã³ãã¥ããã£ããã®æ±ºå®ãäžãã®ã«åœ¹ç«ã€ãã®ã¯ãããŸããïŒ
ã©ããããã®æ±ºå®ã¯ããå°ãåã«è¡ãããŠããããã§ãïŒïŒ18102ã ãã®åé¡ã¯çŸåšè§£æ±ºã§ããŸãã
ããã«ã€ããŠå°ãæŽæ°ããŸãã
æçµçãªèšç»ã¯ãããã©ã«ãã®ãšã¯ã¹ããŒãããå®å šã«ç§»è¡ããããšã§ãã
import { useState } from 'react';
ãã®äžçã§ã¯ãããã¯æ©èœããŸããã
import React from 'react'; // no
å°ãããããã§ãããããã¯ããŸãããã§ãããïŒ
import * as React from 'react';
ããããããã«ããã«ãŒããããŸãã React
ãã€ã³ããŒãããçç±ã¯å®éã«ã¯ããŸããããŸããã
ä»æ¥äººã
ãReact
ã€ã³ããŒãããçç±ã¯ãäž»ã«JSXã«ãããã®ã§ãã ãããã @ lunaruanã¯ãæ°ããJSXãã©ã³ã¹ãã©ãŒã ãšé¢é£ããcodemodã®äœæ¥ãçµäºããŠããããããã®å¿
èŠã¯ãããŸããã
ã ããããªãã¯ããããè¡ãã§ãããïŒ
import React from 'react';
import { useState } from 'react';
function Button() {
const [pressed, setPressed] = useState(false)
return <button />
}
ããã«ïŒ
import { useState } from 'react';
function Button() {
const [pressed, setPressed] = useState(false)
return <button />
}
JSXã¯ãæ£ããã€ã³ããŒããå
éšã«èªåçã«æ¿å
¥ãããããã¹ã³ãŒãã«React
ã¯å¿
èŠãããŸããã
ããããããã©ã«ãã®ãšã¯ã¹ããŒããåé€ããåãã蚱容ã§ãããã®ã«ããŸãã ããªãã¯ããããããã»ã©å¿
èŠãšããŸããã
æ奜家ã®å šäœçãªå°ããªã¹ã©ã€ã¹ãè¶ ããŠESMãå±éããããšã¯å°é£ã§ãã å¹ åºããšã³ã·ã¹ãã ã¯å®éã«ã¯æºåãã§ããŠããããããŸããŸãªããŒã«ã®çµã¿åããã§åé¡ãçºçããæ¹æ³ã¯ãããããããŸãã CJSãšESMã®çžäºäœçšã®æ¹æ³ã¯éåžžã«è€éã§ããããã®çžäºäœçšïŒããã³ãããã©ã®ããã«å€±æãããïŒããããã®åé¡ã®ã»ãšãã©ã®åå ã§ãã
ãããã£ãŠãçŸåšã®èãæ¹ã§ã¯ãESMã«ç§»è¡ãããšãã¯ããã£ãšESMã«ç§»è¡ããŠã¿ãããšããå§ãããŸãã CJSã¯ãŸã£ãããããŸããâãŸãã¯äºææ§ã®ããã¬ã¬ã·ãŒããã±ãŒãžã«åé¢ãããŠããŸãã ããã¯React17ã§ã¯çºçããã18ã§ã¯çºçããå¯èœæ§ã¯äœãã§ãããReact19ã§è©Šãã®ã¯ãã£ãšããããããšã§ãã
@pika/react
ã®ESMãã«ãã«ä»£ãããã®ãæ¢ããŠãã人ã¯ã httpsïŒ//github.com/esm-bundle/reactãšhttps://github.com/esm-bundle/react-domããã§ãã¯ããŠimport React from 'react';
ã¯ãå®å
šãªCDNURLããReactãã€ã³ããŒãããããã«å€æŽãããŠããŸãã ãã1ã€ã®éãã¯ãæ°ããReactããŒãžã§ã³ãå
¬éããããã³ã«ãæåã®æé ãªãã§æ°ããããŒãžã§ã³ãèªåå
¬éãããããšã§ãã
ã³ãŒããµã³ãããã¯ã¹ã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ïŒ https ïŒ index.html
ãšã³ã·ã¹ãã ã®æºåãã§ããŠããªããšããèãã«ç°è°ãå±ãã人ãããŸãã ç§ã¯ããã«ã€ããŠå®å šãªæèãæã£ãŠããŸãããããããå€æŽãéå§ããã®ã«è¯ãææã ãšæããªãã httpsïŒ//github.com/reactjs/rfcs/pull/38ãèŠãŠãäœããè¡šçŸããŠããã ããã°å¹žãã§ããããã«ã€ããŠã®æžå¿µã ããã¯å€§ãŸãã«èããŠããŸãããããããšãå¥ã®ã¢ãããŒãã奜ã¿ãŸããïŒ
ããããããã«ããã«ãŒããããŸãã Reactãã€ã³ããŒãããçç±ã¯å®éã«ã¯ããŸããããŸããã
TypeScriptã䜿çšããŠããå Žåããããåœé¢ã¯ç¶ç¶ããŸãã TSãbabelã®ãã®æ°ããéæ³ã®æ¯ãèãã«ã€ããŠç¥ããŸã§ãéçºè ã¯Reactãæ瀺çã«ã€ã³ããŒããç¶ããå¿ èŠããããæ£ããã€ã³ããŒãã¹ããŒãã¡ã³ããäœã§ããããç¥ãå¿ èŠããããŸãã
JSXã¯å éšã§æ£ããã€ã³ããŒããèªåçã«æ¿å ¥ãããããã¹ã³ãŒãå ã§Reactã䜿çšããå¿ èŠã¯ãããŸããã
s / JSX /æ°ããbabelreactjsxå€æãã©ã°ã€ã³/ã JSXã¯JavaScriptã®æ§ææ¡åŒµã§ãããããèªäœã¯äœãããŸããã
TypeScriptã䜿çšããŠããå Žåããããåœé¢ã¯ç¶ç¶ããŸãã TSãbabelã®ãã®æ°ããéæ³ã®æ¯ãèãã«ã€ããŠç¥ããŸã§ãéçºè ã¯Reactãæ瀺çã«ã€ã³ããŒããç¶ããå¿ èŠããããæ£ããã€ã³ããŒãã¹ããŒãã¡ã³ããäœã§ããããç¥ãå¿ èŠããããŸãã
TypeScriptããŒã ã¯ãã®å€æŽãèªèããŠããã httpsïŒ//github.com/microsoft/TypeScript/issues/34547ã§è¿œè·¡ãããŠã
s / JSX /æ°ããbabelreactjsxå€æãã©ã°ã€ã³/
ã¯ãããããç§ãæå³ããããšã§ãïŒ
reactjs / rfcsïŒ38ã«ç®ãéããæžå¿µãè¡šæããŠããã ããã°å¹žãã§ãã ããã¯å€§ãŸãã«èããŠããŸãããããããšãå¥ã®ã¢ãããŒãã奜ã¿ãŸããïŒ
RFCã®å
ã®ããã¹ãã®äžéšã¯å€ããªã£ãŠããŸãã ESMãã§å®è¡ããããã«NodeJSãã§ããŸã.js
ã®ä»£ããã«ããã¡ã€ã«.mjs
ããªããæå®ãããšããä»"type"
ã§ããªãã®package.jsonãã ïŒããã¥ã¡ã³ãïŒã
å ·äœçã«ã¯ãRFCã®å ã®ããã¹ãã«ã¯æ¬¡ã®ããã«æžãããŠããŸãããããã¯æ£ãããããŸããã
ESMã³ãŒãã¯
.mjs
ãã¡ã€ã«å ã«ããå¿ èŠããããŸã
@frehnerãšæ¬¡ã«ç€ºããŸãã ååä»ã/ããã©ã«ãã®ãšã¯ã¹ããŒãã®åé¡ããESMããŒãžã§ã³ã®Reactã®å ¬éãšçµã³ä»ããŠããªãããšã«æ³šæããŠãã ããã @gaearonã¯ãããã©ã«ãã®ãšã¯ã¹ããŒããæçµçã«
| | ãã§ãŒãº1 | ãã§ãŒãº2 | ãã§ãŒãº3 | ãã§ãŒãº4 |
| -| -------- | -------- | -------- | ------- |
| ESMãå
¬éãããŸãããïŒ | âïž| âïž| âïž| âïž|
| package.json "module"
| â| âïž| âïž| âïž|
| WebPACKã®/ããŒã«ã¢ãã䜿çšESM 1 ã 2 | â| âïž| âïž| âïž|
| package.json "exports"
| â| â| âïž| âïž|
| package.json "type"
| â| â| âïž| âïž|
| NodeJSã¯esmã䜿çšããŸã| â| â| âïž| âïž|
| 倧ããªå€åïŒ | â| â| â| âïž|
| ããã©ã«ãã®ãšã¯ã¹ããŒãã¯ãªããªããŸãããïŒ | â| â| â| âïž|
| ã€ã³ããŒãã«å¿
èŠãªãã¡ã€ã«æ¡åŒµå| â| â| â| â|
| mjsãã¡ã€ã«æ¡åŒµå| â| â| â| â|
ãã§ãŒãº1ã¯å®éã«ã¯æ奜家ã®ã¿ã察象ãšããŠããããããã§ãŒãº1ãšãã§ãŒãº2ãçµã¿åãããã«ã¯æå¹ãªè°è«ããããšæããŸãã ãã ãããã§ãŒãºãåé¢ãããšãåæã®æ¡çšè ã«åé¡ãå ±åããŠä¿®æ£ãèŠã€ããæ©äŒãæåã«äžããããšãªããCRAãšãšã³ã·ã¹ãã å šäœãããã«å£ããªãæ¹æ³ã§ãESMãéåžžã«ãã£ãããšå±éããæ©äŒãåŸããããšæãã®ã§ãããããåå²ããŸããã
@joeldenningãã§ãŒãºã®å€§ãŸããªã¿ã€ãã³ã°ã¯ã©ããªããŸããïŒ ããã¯åã«æéããŒã¹ã§ããããããšããšã³ã·ã¹ãã ã®ããã€ãã®æéãã§ãã¯ãã€ã³ãã«é¢é£ããŠããŸããïŒ require('react')
ã¯ãã§ãŒãº3ã§ãæ©èœããŸããïŒ
ãã§ãŒãºã®å€§ãŸããªã¿ã€ãã³ã°ã¯ã©ããªããŸããïŒ ããã¯åã«æéããŒã¹ã§ããããããšããšã³ã·ã¹ãã ã®ããã€ãã®æéãã§ãã¯ãã€ã³ãã«é¢é£ããŠããŸããïŒ
ãã¹ãŠã®ãã§ãŒãºã®ã¿ã€ãã³ã°ã¯ãå®è¡ããäœæ¥ãšReactã®ãªãªãŒã¹ã¹ã±ãžã¥ãŒã«ã«ãã£ãŠã®ã¿å¶éãããŸãã ç§ã®ç解ã§ã¯ãææ¡ããããã®ã¯ãã¹ãŠãã³ãã©ãŒãšnodejsã«ãã£ãŠãµããŒããããŠããããããããµããŒãããŠããªãå€ãããŒãžã§ã³ã䜿çšããå Žåã¯é©åãªãã©ãŒã«ããã¯ããããŸãã
requireïŒ 'react'ïŒã¯ãã§ãŒãº3ã§ãæ©èœããŸããïŒ
ããã ãšæããŸããã¯ãã https://nodejs.org/api/esm.html#esm_dual_commonjs_es_module_packagesããã³https://nodejs.org/api/esm.html#esm_package_entry_pointsãåç §ããŠ
è¿œå ã®èª¬æãšããŠãå ¬éãããtarballãReactã§ã©ã®ããã«è¡šç€ºãããããææ¡ããŸãã
node_modules/react/
cjs/
react.development.js
react.production.min.js
react.profiling.min.js
umd/
react.development.js
react.production.min.js
react.profiling.min.js
esm/
react.development.js
react.production.min.js
react.profiling.min.js
index.js
ãããŠãããã«package.jsonãæåŸã«ãããã®ã®æŠç®ããããŸãïŒ
{
"type": "module",
"main": "index.js",
"module": "esm/react.development.js",
"exports": {
"import": "./esm/react.development.js",
"require": "./cjs/react.development.js"
}
}
^ããã¯å®å šã«èãæãããŠå®æããããã®ã§ã¯ãããŸããããææ¡ã«å ·äœçãªã³ã³ããã¹ããäžããããã«å ±æããŠããŸãã
ã€ãŸããReactã¯ã¹ããŒããã«ïŒããã¯ïŒã§ããããããã¥ã¢ã«ããã±ãŒãžã®å±éºæ§ã«æ©ãŸãããŠããããããã®ç¶æ
ã¯æ
éã«åé¢ããå¿
èŠããããŸãã CJSãšã³ããªãšESMãšã³ããªã®äž¡æ¹ã§ã€ã³ããŒãã§ããå°ããªCJSãã¡ã€ã«ã«ååšããå¿
èŠããããã .json
ãããŒãããŠãäž¡æ¹ã®ãšã³ããªãããã®ç¶æ
ã§å€æŽããæ¹æ³ããããŸãïŒ100ïŒ
確信ãæãŠãŸããïŒ 2çªç®ã®ã¢ãããŒãïŒã
ãŸãããã§ãŒãº1ã§ãã§ã«è¡ãããŠãããååä»ããšã¯ã¹ããŒããè¿œå ããããŒãã«ã«ãªã¹ãããããšãéèŠã ãšæããŸãã
ããã€ãã®ã³ãŒããŒã±ãŒã¹ãèŠéããŠããªããã©ããã¯ãŸã 100ïŒ
ããããŸãããããã®ãããã¯ã¯éåžžã«è€éã§ãã åæã«ãã¹ã±ãžã¥ãŒã«ã¯ãšã³ã·ã¹ãã ã®ãã§ãã¯ãã€ã³ãã«é¢é£ä»ããå¿
èŠããããŸãããã§ãŒãº3ã¯ã exports
ããã³ãã©ãŒã§ååã«ãµããŒããããŠããå Žåã«ã®ã¿åºè·ã§ããŸããããããªããšãæœåšçãªåé¡ãçºçããå¯èœæ§ããããŸãã
Reactã¯ã¹ããŒããã«ïŒããã¯ïŒã§ããããããã¥ã¢ã«ããã±ãŒãžã®å±éºæ§ããããŸãããããã£ãŠããã®ç¶æ ã¯æ éã«åé¢ããå¿ èŠããããŸãã
è¯ãç¹ãç§ã¯ãããèæ ®ããŠããŸããã§ããïŒè©³çŽ°ïŒã ãã®å ŽåãããããCJS / ESMãã«ãéã®å ±æãã¡ã€ã«ã®ææ¡ã圹ç«ã€ã§ãããã ãããã¯ãESMããŒãžã§ã³ã¯reactã®å®å šãªã³ããŒã§ã¯ãªããCJSãã«ããåŒã³åºãESMãããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ããå¯èœæ§ããããŸãã
ãŸãããã§ãŒãº1ã§ãã§ã«è¡ãããŠãããååä»ããšã¯ã¹ããŒããè¿œå ããããŒãã«ã«ãªã¹ãããããšãéèŠã ãšæããŸãã
ãœãŒã¹ã³ãŒãã§ã¯ãããã¯ãã§ã«åœãŠã¯ãŸãããã§ããïŒ ç§ã®ç¥ãéãããœãŒã¹ã³ãŒãã¯ãã§ã«ååä»ããšã¯ã¹ããŒããšããŠç©äºããšã¯ã¹ããŒãããŠããŸãã
ããã€ãã®ã³ãŒããŒã±ãŒã¹ãèŠéããŠããªããã©ããã¯ãŸã 100ïŒ ããããŸãããããã®ãããã¯ã¯éåžžã«è€éã§ãã åæã«ãã¹ã±ãžã¥ãŒã«ã¯çæ ç³»ã®ãã§ãã¯ãã€ã³ãã«é¢é£ä»ããå¿ èŠããããŸãããã§ãŒãº3ã¯ã茞åºããã³ãã©ãŒã§ååã«ãµããŒããããŠããå Žåã«ã®ã¿åºè·ã§ããŸããããããªããšãæœåšçãªåé¡ãçºçããå¯èœæ§ããããŸãã
ãã§ãŒãº3ã«ã€ããŠåæããŸãã-ãããããããé倧ãªå€æŽã§ãã£ããã©ããã«ã€ããŠçå笊ãä»ããçç±ã§ãã package.jsonãšã¯ã¹ããŒããè¿œå ããããšã¯ããšã³ã·ã¹ãã å ã®ä»ã®ããã±ãŒãžã«ãšã£ãŠãã°ãã°é倧ãªå€æŽã§ãã£ãããšãç§ã¯ç¥ã£ãŠããŸãã ãããŠããããã¯ã¯ééããªãè€éã§ãã 泚æãã¹ãç¹ã®1ã€ã¯ãå¿ èŠã«å¿ããŠããã§ãŒãº3ãšãã§ãŒãº4ã®é åºãå ¥ãæ¿ããããšãã§ãããšããããšã§ãã åãã§ãŒãºãå®è£ ãã人ã¯ãwebpackãrollupãnodejsãªã©ã®å€ãã®ããŒãžã§ã³ã®éåžžã«åŸ¹åºçãªãã¹ããè¡ãå¿ èŠããããšæããŸããå®è¡ããäœæ¥ãç°¡åã ãšèšã£ãŠããã®ã§ã¯ãããŸãããããã§ã¯ãããã移è¡çµè·¯ã§ã:)
ãœãŒã¹ã³ãŒãã§ã¯ãããã¯ãã§ã«åœãŠã¯ãŸãããã§ããïŒ ç§ã®ç¥ãéãããœãŒã¹ã³ãŒãã¯ãã§ã«ååä»ããšã¯ã¹ããŒããšããŠç©äºããšã¯ã¹ããŒãããŠããŸãã
ãã-ããã§ãããã®å Žåã export default
ãè¿œå ããããã®ããŒãã«è¡ãããã¯ãã§ãðçŸåšã»ãšãã©ã®ãã³ãã©ãŒã§æ©èœããäžè¬çã«äººæ°ããããŸããã default
ãæäŸããã«çã®ESMãšã³ããªãè¿œå ãããšãããã®äœ¿çšæ³ãç Žãã
ãã®å Žåããšã¯ã¹ããŒãã®ããã©ã«ããè¿œå ããããã®ããŒãã«è¡ãå¿ èŠã§ã
ã¯ããè¯ãç¹ã§ãã è¿œå ããŸãã ããããã£ãŠããPRã¯ãæªãããã«èŠããããšæããŸãããçŸåšã®ãããªãã¯ã€ã³ã¿ãŒãã§ãŒã¹ããã®ãŸãŸåãå ¥ããŠãããä»åŸãæ¹åããŠããäºå®ã§ãã
ããã€ãã®ããŒãžã§ã³ãå ¬éããããšããã«æ»ãããšã¯ãªãã
éçº/æ¬çªãã«ãã®åå²ãã©ã®ããã«åŠçãããããšããåé¡ããããŸãã å®éãReactãã«ãã®ã¹ããŒããã«ãªæ§è³ªãç¶æããããšã¯éåžžã«éèŠã§ãã
ããã€ãã®ããŒãžã§ã³ãå ¬éããããšããã«æ»ãããšã¯ãªãããã®ããŒãžã§ã³ã«å¯Ÿããã»ãã³ãã£ãã¯ã®å€æŽã¯å£ããããšã«æ³šæããå¿ èŠããããŸãã ã¡ãžã£ãŒãé »ç¹ã«ãªãªãŒã¹ããªãããšãèãããšããã£ãŒã³ãæå°éã«æããããã«ãå€æŽããããåŠçããæ¹æ³ãæ€èšããå¿ èŠããããŸãã
è¯ãç¹ã ç§ã®èãã¯ãReact 16ã§å
¬éãããŠããESMãã«ãã«æ瀺çãªexport default React
ãè¿œå ããããšã§ããPRã¯ã決å®ãããå®å
ã§ã¯ãªããããçãã²ãããç©è°ãéžãå¯èœæ§ããããšæããŸãã ãã ããç§ã®èŠè§£ã§ã¯ãReact 16ã§ESMããã«ãããå°æ¥ã®ã¡ãžã£ãŒããŒãžã§ã³ã§export default
ãåé€ããããšãã§ããŸãã ç§ã«ãšã£ãŠã import React from 'react';
ãä»ããŠreactã䜿çšããããšã¯éåžžã«äžè¬çã§ãããããESMãã«ãã§ããã©ã«ãããšã¯ã¹ããŒãããããšã¯åã«ãç§ãã¡ãããå Žæãåãå
¥ãããããšã§ãã å°æ¥ã®ã¡ãžã£ãŒããŒãžã§ã³ã¯ãããåé€ããã§ãããã
ãŸããé倧ãªå€æŽã®æå°åã«é¢é£ããŠããŸã-ãã§ãŒãº3ãš4ã¯ãåãã¡ãžã£ãŒãªãªãŒã¹ã®äžéšã§ããå¯èœæ§ããããŸãã ãã§ãŒãº3ã¯ãå®å šãªäžäœäºææ§ã®ããæ¹æ³ã§å®è¡ã§ããå¯èœæ§ããããŸãããã®å Žåã16ãªãªãŒã¹ã«äŸµå ¥ããå¯èœæ§ããããŸãã ããããããã¯ããªãããŒã§ãããç§ã¯ããã«ã€ããŠèªä¿¡ãæã£ãŠååã«ç¥ããŸããã
éçº/æ¬çªãã«ãã®åå²ãã©ã®ããã«åŠçãããããšããåé¡ããããŸãã
ããã¯ç§ãèŠèœãšããŠãããã®ã§ãã ãã³ãã©ãŒãšNodeJSã®äž¡æ¹ã§ESMã䜿çšããŠãããè¡ãæ¹æ³ã¯ããããŸããããäœãå¯èœãã調ã¹ãããã«ããã€ãã®èª¿æ»ãè¡ããŸãã ç§ã¯ãã®æ»ãã ææ¡ãèŠã€ããŸããããçããŠãããã®ã調ã¹ãŸã:)
å®éãReactãã«ãã®ã¹ããŒããã«ãªæ§è³ªãç¶æããããšã¯éåžžã«éèŠã§ãã
åæããŸããã 泚æãã¹ãç¹ã®1ã€ã¯ãReactãã«ãã®ã¹ããŒããã«ãªæ§è³ªã¯ããã§ãŒãº1ãš2ã§ã¯ãªãããã§ãŒãº3ã§ã®ã¿è§£æ±ºããå¿ èŠããããšããããšã§ãã @ Andaristãšç§ãææ¡ãããªãã·ã§ã³ã¯ããã解決ããããã«æ©èœããŸãã
ä»æãç°¡åãªãæãåŸæ¹äºææ§ã®ã¢ãããŒãã¯ãååã®èŒžå ¥ãå¯èœã«ããããã®ç°¡åãªESMã©ãããŒãè¿œå ããããšã§ãã
ãããReactã«è¿œå ããããã®PRãäœæããŠããexportsããã£ãŒã«ãã®è¿œå ãé倧ãªå€æŽã«ãªããªãããã«ããããšæããŸãïŒãããç°¡åã«æ±ºå®ã§ããããŒã«npx ls-exports
ãäœæããŸããïŒã ãã«ãããã»ã¹ãªãã§ESMã䜿ãããšãã人ã
ã«ã¯åœ¹ç«ã¡ãŸããããããã¯åã
ã®ããã±ãŒãžããšã«ãã解決ã§ããªããšããåé¡ã§ãã
@gaearonããã¯åœ¹ã«ç«ã¡ãŸããïŒ React16ã«semver-minorãšããŠçéžããå¯èœæ§ããããŸãã
CJSãã«ãã¯ãçŸåšãšåæ§ã«ç°å¢æ€åºãåŒãç¶ã䜿çšãããããESMã®ïŒããŒãã§æªè§£æ±ºã®ïŒåé¡ããŸã ææ¡ããå¿ èŠã¯ãããŸããã
ãã ããç§ã®èŠè§£ã§ã¯ãReact 16ã§ESMããã«ãããå°æ¥ã®ã¡ãžã£ãŒããŒãžã§ã³ã§ãšã¯ã¹ããŒãã®ããã©ã«ããåé€ããããšãã§ããŸãã
ãã1ã€ã®æžå¿µã¯ãæ§æã®æ°ãå¢ãããšãšã³ã·ã¹ãã ã«è² æ ããããããšã§ãã ããšãã°ãESMãã«ãããªãªãŒã¹ããå Žåãããã©ã«ãã®ãšã¯ã¹ããŒããªã©ã次ã®ãªãªãŒã¹ã§ç¢ºå®ã«åé€ãããã®ãå«ããã¹ãã§ã¯ãªããšæããŸãã èšãæããã°ãè¿œå ãããã°ããã®äœãïŒESMãã«ãïŒã«ãæ¶ããŠãããã®ïŒããã©ã«ãã®ãšã¯ã¹ããŒãïŒãå°å ¥ããããšã¯ããŸãæå³ããªããšæããŸãã
ãã ããç§ã®èŠè§£ã§ã¯ãReact 16ã§ESMããã«ãããå°æ¥ã®ã¡ãžã£ãŒããŒãžã§ã³ã§ãšã¯ã¹ããŒãã®ããã©ã«ããåé€ããããšãã§ããŸãã
ãã1ã€ã®æžå¿µã¯ãæ§æã®æ°ãå¢ãããšãšã³ã·ã¹ãã ã«è² æ ããããããšã§ãã ããšãã°ãESMãã«ãããªãªãŒã¹ããå Žåãããã©ã«ãã®ãšã¯ã¹ããŒããªã©ã次ã®ãªãªãŒã¹ã§ç¢ºå®ã«åé€ãããã®ãå«ããã¹ãã§ã¯ãªããšæããŸãã èšãæããã°ãè¿œå ãããã°ããã®äœãïŒESMãã«ãïŒã«ãæ¶ããŠãããã®ïŒããã©ã«ãã®ãšã¯ã¹ããŒãïŒãå°å ¥ããããšã¯ããŸãæå³ããªããšæããŸãã
次ã®ãªãªãŒã¹ã®é·ãã«ããããšæããŸãã é±ã®éãã«ã€ããŠè©±ããŠããå Žåãããã¯åççãªããã§ãã ããããç§ãã¡ãæ°ã¶æ/æ°å¹Žè©±ããŠããã®ãªãããªãããããã®æéã®éåºãã®ãæªãã®ãåãããŸãã
ãã®å Žåã®æžå¿µã¯ããããé·ãååšããã»ã©ãçŸåšã®åœ¢ã§ããå€ãã®äººã ãããã«äŸåããããšã§ãã ãããŠãããã«é倧ãªå€æŽãå°å ¥ãããšãReactã®ã¢ããã°ã¬ãŒããããå°é£ã«ãªããŸãã çŸåšãESMã®ç§»è¡ã¯1ã€ã ãã§ãªããããã€ããããŸãããžã£ã³ããæ©ãããŠãåŸã§å¥ã®ç§»è¡ã®ããã®ãªãœãŒã¹ããªãããã«åãæ®ããã人ãããŸãã ããã¯ãESMã®å Žåããšã³ã·ã¹ãã å šäœã«æ³¢åããŸãã
ESMãã«ãããªãªãŒã¹ããå Žåãããã©ã«ãã®ãšã¯ã¹ããŒããªã©ã次ã®ãªãªãŒã¹ã§ç¢ºå®ã«åé€ãããã®ãå«ããã¹ãã§ã¯ãªããšæããŸãã èšãæããã°ãè¿œå ãããã°ããã®äœãïŒESMãã«ãïŒã«ãæ¶ããŠãããã®ïŒããã©ã«ãã®ãšã¯ã¹ããŒãïŒãå°å ¥ããããšã¯ããŸãæå³ããªããšæããŸãã
ç§ã¯import React from 'react'
ãæ°ããè¿œå ããããã®ãšããŠã§ã¯ãªããçŸåšã®çŸå®ãåãå
¥ãããã®ãšèŠãªããŠããŸãã ããã¯ããããæå³çã§ã¯ãªããçŸåšã¯å»æ¢ãããESM / CJSçžäºéçšæ©èœã®å¯äœçšã«ãããŸãããããããå®è¡ããã³ãŒãã¯ãŸã æ°åïŒæ°çŸäžïŒïŒè¡ãããŸãã å¥ã®æ¹æ³ïŒååä»ããšã¯ã¹ããŒãã®ã¿ããšã¯ã¹ããŒãããïŒã¯ããŠãŒã¶ãŒã«ãESMãã«ãããã€ããŒããŒãžã§ã³ã§å
¬éããŸãããããã¹ãŠã®ã³ãŒããå€æŽããã«äœ¿çšããããšã¯ã§ããŸããããšèšã£ãŠããŸããã¡ãžã£ãŒããŒãžã§ã³ã®ãªãªãŒã¹ããŒãã«ãããŸãã
ç§ã¯èå³ããããŸã-ããã©ã«ãã®ãšã¯ã¹ããŒãã䜿çšããESMãäžäœäºææ§ã®ããæ¹æ³ã§è¿œå ããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯ä»¥åã«çºçããããšããããŸãïŒããšãã°ãé¢é£ããåé¡ã«ããªã³ã¯ããŠããhttps://github.com/facebook/react/pull/18187ïŒã åé¡ããããšWebPACKã®CJS < - >ããªãããã£ãŠCJSã³ãŒããæã£ãŠããå Žåã¯ESMçžäºéçšrequire('react')
ã®WebPACKã¯ãESMã®ååšã«æ»ããŸãäœreact
ããã©ã«ãã®ãšã¯ã¹ããŒããšããæã€ãªããžã§ã¯ãã§ãdefault
CJS react
é¢ä¿ãªãã default
ããããã£ïŒã€ãŸãã require('react').default
ãå¿
èŠã«ãªããŸãïŒã ããããnamedããšã¯ã¹ããŒãããå Žåã¯ãåé¡ã¯ãããŸãããïŒ @TrySoundã¯ã以åã«ä»ã®ããã±ãŒãžã§ãã®ãããªåé¡ã«
ããããnamedããšã¯ã¹ããŒãããå Žåã¯ãåé¡ã¯ãããŸãããïŒ
ã¯ããããã¯ç§ãèããŠããã¢ãããŒãã§ãã https://unpkg.com/browse/@esm-bundle/react @ 16.13.1 / esm / react.development.jsã®æåŸã®40è¡ãåç §ããŠãã ãã-ããã¯Reactã®éå ¬åŒããŒãžã§ã³ã§ããããããæ£ç¢ºã«å®è¡ããè€æ°ã®ãŠãŒã¶ãŒã䜿çšããŠããŸãå ¬åŒReactã®ããããã€ã³ä»£æ¿ãšããŠã®çµç¹ã é倧ãªå€æŽã¯ãããŸããã
ããããnamedããšã¯ã¹ããŒãããå Žåã¯ãåé¡ã¯ãããŸãããïŒ
ã¯ããããã¯ç§ãèããŠããã¢ãããŒãã§ãã https://unpkg.com/browse/@esm-bundle/react @ 16.13.1 / esm / react.development.jsã®æåŸã®40è¡ãåç §ããŠãã ãã-ããã¯Reactã®éå ¬åŒããŒãžã§ã³ã§ããããããæ£ç¢ºã«å®è¡ããè€æ°ã®ãŠãŒã¶ãŒã䜿çšããŠããŸãå ¬åŒReactã®ããããã€ã³ä»£æ¿ãšããŠã®çµç¹ã é倧ãªå€æŽã¯ãããŸããã
ããããCJSã³ãŒããŸãã¯ESMãããããæ¶è²»ããŠããŸããïŒ éåžžã«é©ãã¹ãããšã¯ãCJS <-> ESMçžäºéçšã®åé¡ã ããã§ãã
@gaearonæ確ã«ãã; ç§ãææ¡ããŠããESMã©ãããŒã«ããã©ã«ãã®ãšã¯ã¹ããŒãããªãããšã¯çã«ããªã£ãŠããŸãã ãã€ãã£ãESMãå®è¡ããŠãã人ã¯èª°ã§ãããããåé¿ããããã«import * as React from 'react'
ãå®è¡ããŸãã 誰ããä»ãããã¯ããªããä»ããã©ã«ããè¿œå ããããªãã£ãå Žåã¯V17ãŽãåŸ
ã€å¿
èŠãããã ããã®ã§ãçªç¶ãããã©ã«ãã®ãšã¯ã¹ããŒããæããªãããã«ç Žå£å€æŽãšããŠãããèŠãã ãããšãã£ãŠããããšããããããã®å
¬æ£ãªã
ããããCJSã³ãŒããŸãã¯ESMãããããæ¶è²»ããŠããŸããïŒ éåžžã«é©ãã¹ãããšã¯ãCJS <-> ESMçžäºéçšã®åé¡ã ããã§ãã
CJSãã¡ã€ã«ãšESMãã¡ã€ã«ã®äž¡æ¹ããwebpackã«æ£åžžã«ã€ã³ããŒãããŸããã
ãã€ãã£ãESMãå®è¡ããŠãã人ã¯èª°ã§ãããããåé¿ããããã«ãreactãããReactãšããŠ*ãã€ã³ããŒãããŸãã ãã ãããããå®è¡ããŠãã人ã¯ãçªç¶ããã©ã«ãã®ãšã¯ã¹ããŒãããªããªããšããé倧ãªå€æŽãšèŠãªãã®ã¯åœç¶ã§ãããããã£ãŠãããã©ã«ããä»ããè¿œå ããããªãå Žåã¯ãv17ãŸã§åŸ ã€å¿ èŠããããŸãã
åæããŸããã ãŒãããå§ããå Žåã¯ãããã©ã«ãã®ãšã¯ã¹ããŒããè¡ãå¿ èŠã¯ãããŸããã ãã ããããã©ã«ãã®ãšã¯ã¹ããŒããè¿œå ããªããšãé倧ãªå€æŽãªãã«ãã§ãŒãº2ãå®è£ ããããšã¯ã§ããŸããã å人çã«ã¯ãReact 16ã§ãã§ãŒãº1ããReact 17+ã§ãã§ãŒãº2ã4ãå®è¡ããŠãåé¡ãããŸãããããã§ãŒãº1ã2ãå Žåã«ãã£ãŠã¯3ãå®è¡ããããšããå§ãããŸãïŒ
ãã®ææ¡ããç¶ç¶ããŸãã ããã¯ãç¶æ ãå¥ã®å Žæã«åé¢ããããšã«ãã£ãŠãã¥ã¢ã«ããã±ãŒãžã®å±éºã«å¯ŸåŠããå®å šãªCJSããã³ESMãœãŒã¹ãåãããã¥ã¢ã«ããã±ãŒãžãžã®åãæ¿ãã®ææ¡ã®ããã§ãïŒã¢ãããŒã2 ïŒã 以åã®RFCïŒã¢ãããŒã1 ïŒã®ããã«ESMã©ãããŒã䜿çšããã®ãšã¯å¯Ÿç §çã§ãã
ãããåæãšããŠãç§ã¯ãŸã èšåãããŠããªãããšã®ããã€ãã®ã¡ã¢ãæã£ãŠããŸãã
.js
䜿çšããNode.jsããã±ãŒãžãäœæããããšã¯ã§ããŸããã "type": "module"
ãèšå®ããå Žåããã¹ãŠã®CommonJSãã¡ã€ã«ã¯ä»£ããã«.cjs
ãã¡ã€ã«æ¡åŒµåã䜿çšããå¿
èŠããããŸããComponent
ã¯ã©ã¹ã®å®è£
ãç¶æ
ãå
±æããCJSã³ãŒãã®äžéšã§ã¯ãªãã代ããã«CJS / ESMãã³ãã«ã®äžéšã§ããå ŽåãããŸããŸãªã©ã€ãã©ãªã§instanceof Component
ãã§ãã¯ãè¡ããããªã¹ã¯ããããŸããéå ±ãESMãã¡ã€ã«ãšCommonJSãã¡ã€ã«ã®äž¡æ¹ã.jsã䜿çšããNode.jsããã±ãŒãžãäœæããããšã¯ã§ããŸããã ãtypeãïŒãmoduleããèšå®ããå Žåããã¹ãŠã®CommonJSãã¡ã€ã«ã¯ä»£ããã«.cjsãã¡ã€ã«æ¡åŒµåã䜿çšããå¿ èŠããããŸãã
ããã¯NodeJSã«åœãŠã¯ãŸããŸãïŒãã³ãã©ãŒã«ã¯åœãŠã¯ãŸããŸããïŒããããã£ãŠã cjs
ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã¯.cjs
çµããå¿
èŠããããŸãã
åãããã±ãŒãžã®æœåšçã«2ã€ã®ããŒãžã§ã³ãããŒããããšããã®ãããªå Žåã«Reactã®ã¡ã¢ãªãããããªã³ããå¢å ããŸã
ããã«ãããnpmã«å
¬éãããtarballã®ãµã€ãºã倧ãããªãããã£ã¹ã¯äžã®å
šäœã®ãµã€ãºã倧ãããªãããšãããããŸãã ãããããããã¡ã¢ãªã«ã©ã®ããã«åœ±é¿ãããã¯ããããŸããã ç§ã®ç¥ãéãããã³ãã©ãŒãšNodeJSã¯ã import
/ require()
ä»ããŠããŒããããŠããªãã³ãŒããã¡ã¢ãªã«åã蟌ã¿ãŸããã ã¡ã¢ãªãŒãããããªã³ããã©ã®ããã«å€åããããæ確ã«ã§ããŸããïŒ
ããšãã°ãComponentã¯ã©ã¹ã®å®è£ ãç¶æ ãå ±æããCJSã³ãŒãã®äžéšã§ã¯ãªãã代ããã«CJS / ESMãã³ãã«ã®äžéšã§ããå ŽåãããŸããŸãªã©ã€ãã©ãªã®instanceofComponentãã§ãã¯ãç Žæãããªã¹ã¯ããããŸãã
äžã€ã®ææ¡ããã解決çã¯ãïŒ 1 ã 2 ïŒNodeJS ESMå®è£
ã¯CJSã³ãŒãã«ã³ãŒã«ããããšãåã«ESMã€ã³ã¿ãŒãã§ãŒã¹ã§ããããšã§ãã ãã®ããã«ãNodeã§äœ¿çšãããComponent
å®çŸ©ã¯1ã€ã ãã§ãã ãã ãããã§ãŒãº1ãšãã§ãŒãº2ã¯ãNodeJSã§å®è¡ããããã®ãå€æŽããªããããããã¯ãã§ãŒãº3ã«ã®ã¿é©çšãããŸãã
ç§ãã¡ïŒwebpackïŒãæè¿webpack 5ã«exports
ãã£ãŒã«ããµããŒããè¿œå ããã®ã§ããã®ãããã¯ã«2ã»ã³ããäžããããšæããŸãã
exports
ãã£ãŒã«ãã«é¢ããå€ãã®æ
å ±ãå«ãŸããŠããŸãïŒ development
ãšproduction
æ¡ä»¶ãè¿œå ããŸãããããã¯ãåå¿ã«éåžžã«åœ¹ç«ã¡ãŸãã ïŒ process.env.NODE_ENV
ã¯åŒãç¶ããµããŒããããŠããŸãããããã³ããšã³ãã³ãŒãã§ã¯äžè¬çã«é¿ããå¿
èŠããããŸããããã¯Node.jsåºæã§ãïŒrequire("esm")
ãµããŒãããŠãããåžžã«ESMã䜿çšããããšã§ãã¥ã¢ã«ã¹ããŒãã®åé¡ãåé¿ã§ããŸãïŒ require()
ïŒã webpackã¯ãã®ããã®ç¹å¥ãªæ¡ä»¶ãå°å
¥ããŸããïŒ module
ã ãã®CommonJsãšESMããŒãžã§ã³ã§ã¯ãåãã€ã³ã¿ãŒãã§ãŒã¹ããšã¯ã¹ããŒãããå¿
èŠããããŸãã çŸåšãNode.js以å€ã«ãã¥ã¢ã«ã¹ããŒãã®åé¡ããããã®ã¯ãããŸããã ããã¯äž»ã«åŸæ¹äºææ§ã®åé¡ã§ãããããå°æ¥çã«äœããçºçããããšã¯ãªããšæããŸãã{
"type": "commonjs",
"main": "index.js",
"module": "esm/wrapper.js",
"exports": {
".": {
"node": {
"development": {
"module": "./esm/index.development.js",
"import": "./esm/wrapper.development.js",
"require": "./cjs/index.development.js"
},
"production": {
"module": "./esm/index.production.min.js",
"import": "./esm/wrapper.production.min.js",
"require": "./cjs/index.production.min.js"
},
"import": "./esm/wrapper.js",
"default": "./cjs/index.js"
},
"development": "./esm/index.development.js",
"production": "./esm/index.production.min.js",
"default": "./esm/index.production.min.js"
},
"./index": "./index.js",
"./index.js": "./index.js",
"./umd/react.development": "./umd/react.development.js",
"./umd/react.development.js": "./umd/react.development.js",
"./umd/react.production.min": "./umd/react.production.min.js",
"./umd/react.production.min.js": "./umd/react.production.min.js",
"./umd/react.profiling.min": "./umd/react.profiling.min.js",
"./umd/react.profiling.min.js": "./umd/react.profiling.min.js",
"./package.json": "./package.json"
}
}
ãããã®ãã£ã¬ã¯ããªã®æ¡åŒµåãšããŠ.js
ã䜿çšã§ããŸãã ãŸãã¯ã .mjs
ã䜿çšããããšãã§ããŸãããããŒã«ãæ¡åŒµæ©èœããã§ãã¯ãããšãã«ãããã«ããæœåšçãªå¯äœçšãçºçããå¯èœæ§ããããŸãã ãããã£ãŠãå®å
šã®ããã«.js
ã
{
"type": "module"
}
ãã®ã©ãããŒã¯ãNode.jsããã¥ã¢ã«ã¹ããŒãã®åé¡ãåé¿ããããã«å¿ èŠã§ãã
import React from "../cjs/index.js";
export const {
Children,
Component,
...,
useState,
version
} = React;
export { React as default };
ããã¯ã development
ããã³production
æ¡ä»¶ããµããŒããããŠããªãå Žåã«Node.jsã«ãã£ãŠäœ¿çšãããŸãã
'use strict';
if (process.env.NODE_ENV === 'production') {
module.exports = require('./cjs/react.production.min.js');
} else {
module.exports = require('./cjs/react.development.js');
}
ãããã®ã©ãããŒã¯ãNode.jsããã¥ã¢ã«ã¹ããŒãã®åé¡ãåé¿ããããã«å¿
èŠã§ãã
ãããã¯ãNode.jsãdevelopment
ããã³production
æ¡ä»¶ãè¿œå ããå Žåã«ã®ã¿äœ¿çšãããŸãã
import React from "../cjs/index.development.js";
export const {
Children,
Component,
...,
useState,
version
} = React;
export { React as default };
åŸæ¹äºææ§ã®ããã
module.exports = require('./cjs/index.js');
ããã¯ã exports
ãã£ãŒã«ãã module
æ¡ä»¶ãããã³production
/ development
æ¡ä»¶ããµããŒãããããŒã«ã«ãã£ãŠäœ¿çšãããŸãã
/* React in ESM format */
// compat for the default exports with support for tree-shaking
import * as self from "./esm/index.development.js";
export { self as default }
./esm/index.development.js
ãŸãã¯./esm/index.production.min.js
./cjs/index.js
./cjs/index.js
./esm/wrapper.js
./cjs/index.js
ïŒå¿
é ïŒãŸãã¯./esm/wrapper.js
ïŒã€ã³ããŒãïŒ./cjs/index.js
./cjs/index.development.js
./esm/wrapper.development.js
ãŸãã¯./esm/wrapper.production.min.js
./cjs/index.production.min.js
ãå¿
é ã®å Žåã¯./cjs/index.development.js
ãŸãã¯./cjs/index.production.min.js
ESMã§ã¯ã倧ããªãã¬ãŒããªãããªããã°ãæ¡ä»¶ä»ãã§ããŒãžã§ã³ãéžæããããšã¯ã§ããªãããã esm/index.js
ã¯ãããŸããã
ããŒã«ã¯ã exports
ãã£ãŒã«ãã module
æ¡ä»¶ïŒãã¥ã¢ã«ã¹ããŒãã®åé¡ã®ããïŒãããã³production
/ development
ããµããŒãããŠããå Žåã«ã®ã¿ãreactESMããå®å
šã«æ©æµãåããããšãã§ããŸãã
ããŒã«ãmodule
ãã£ãŒã«ããŸãã¯exports
ãã£ãŒã«ãããµããŒãããŠããå ŽåãããŒã«ã¯ReactESMããéšåçã«æ©æµãåããããšãã§ããŸãã
import { useState } from "react"
ãŸãã¯import * as React from "react"
ã¯ãreactãCommonJsã¢ãžã¥ãŒã«ã§ããéããæè¡çã«éæ³ã§ãã
ã»ãšãã©ã®ããŒã«ã¯åŒãç¶ãåŸæ¹äºææ§ããµããŒãããŠããŸãããNode.jsãªã©ã®äžéšã®ããŒã«ã¯ãµããŒãããŠããŸããã
ãããã£ãŠãçŸåšãã©ãã§ãæå¹ãªreactã䜿çšããå¯äžã®æ¹æ³ã¯ã import React from "react"
ã§ãã
ãã®æ¹æ³ã¯ãµããŒãããããŸãŸã§ããå¿
èŠããããŸããããããªããšãçŸåšã®åå¿ãšESMã®è¿œå åŸã«åå¿ããã®ã«æå¹ãªæ§æããªãå ŽåïŒNode.js 14ãªã©ïŒãçºçããŸãã
Node.jsã¯ãä»ã®ãšããexports
development
/ production
æ¡ä»¶ã®è¿œå ãæåŠããŸããã
ããã¯æ²ããããšã§ãããããŠç§ã¯ãŸã 圌ããæçµçã«ãããè¿œå ããããšãé¡ã£ãŠããŸãã
ãã®ãããäžèšã®exports
ãã£ãŒã«ãã§ãµããŒããçšæãããŠããŸãã
@sokraçŽ æŽãããå èš³ãéåžžã«åœ¹ã«ç«ã¡ãŸãããããããšãïŒ
1ã€ã®å°ããªè³ªåïŒ
Node.jsã¯ãçŸæç¹ã§ã¯ããšã¯ã¹ããŒãã®éçº/æ¬çªæ¡ä»¶ã®è¿œå ãæåŠããŸããã
ç§ã®ç解ã§ã¯ãããã¯ãŸã åãçµãã§ãããšããããšã§ããïŒ https://github.com/nodejs/node/pull/33171ããããããããç§ã¯ãã®PRã誀解ããŠããŸã
[ç·šé]ç§ããªã³ã¯ããäžèšã®PRã¯ã httpsïŒ//github.com/nodejs/node/pull/34637ã«çœ®ãæããããŸãã
[edit2]ãããŠnodejsã«ããŒãžãããŸãã
@sokraã«æè¬ã
ãããç§ãèŠããªãã·ã§ã³ã§ãã ãããã¯ãã¹ãŠæè¡çã«å¯èœã§ããã決å®ã¯æè¡çãªå®è£ ãããæŠç¥ã®1ã€ã§ããããã«æãããŸãã
è¿œå export default React
ã«ã¯ã17 ESMãã«ããåå¿ããããã«CJSãµããŒãäžåºŠãããåé€import React from 'react'
ïŒãããã18ãåå¿ãããã®ïŒïŒãããããããŸãã
export default React
è¿œå ããªãã§ãã ããããŸããååä»ããšã¯ã¹ããŒãã®ã¿ã䜿çšããŠReact 17ESMãã«ããäœæããŠãã ããã
React 17ESMãã«ããå
¬éããªãã§ãã ããã ïŒð¢ïŒESMãã«ããäœæããåã«ã import React from 'react';
ãµããŒããåé€ããããŸã§åŸ
ã¡ãŸãã
| | ãªãã·ã§ã³1 | ãªãã·ã§ã³2 | ãªãã·ã§ã³3 |
| -| -------- | -------- | -------- |
| åç
§ãããŠããªãESMãã«ã| v17 | v17 | v18 + |
| package.json "module"ïŒããã©ã«ãã§ã¯ããªãŒã·ã§ã€ã¯ïŒ| v17 | v18 + | v18 + |
| package.json "type" / "exports"ïŒNodeJSã¯ESMã䜿çšããŸãïŒ| v18 + 1 | v18 + | v18 + |
äžã§èª¬æããããã«ãç§ã®å¥œã¿ã¯ãªãã·ã§ã³1ã§ãã ãã ãããªãã·ã§ã³2ãéåžžã«ãšããµã€ãã£ã³ã°ã§ãã ãã¡ããããªãã·ã§ã³3ã¯ããã»ã©åºæ¿çã§ã¯ãããŸããã ãã®githubã®åé¡ã§ç§ãéãããã®ãããç§ãã¡ã¯ãããã®ãããããå®çŸããããã®æè¡çãªå°éç¥èãæã£ãŠããŸãïŒãããŠããããåŽåãããïŒïŒã
ãã®åé¡ã«å¯Ÿããæåã®åå¿ã¯ããªããã®åé¡ã¯3幎çµã£ãŠãéãããŠããã®ããšããããšã§ããã ãã®äžéšãèªãã åŸããªãããããããªã«æéããããã®ãç解ã§ããŸãã Reactã®ãããªã©ã€ãã©ãªãç¶æããããšã¯å€§ããªä»äºã§ãã ã ããðð»
React 17ã«é¢ããæè¿ã®ãã¥ãŒã¹ãèžãŸããŠã以åã®ã³ã¡ã³ããæŽæ°ããŠãå°æ¥ã®èšç»ã§16ã§ã¯ãªãReact17ãåç §ããããã«ããŸããã
äžèšã®3ã€ã®ãªãã·ã§ã³ã®ã©ãã奜ãŸãããã«ã€ããŠã®ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãã
React 17ã®package.json
ã«exports
ãã£ãŒã«ããè¿œå ã§ãããšæããŸããããããã以åã®ããŒãžã§ã³ã«ããã¯ããŒãããããšãã§ããŸãã
{
"exports": {
".": {
"development": "./esm/react.development.mjs",
"production": "./esm/react.production.mjs",
"node": {
"import": "./esm/react.node.mjs",
"require": "./index.js"
},
"default": "./index.js"
},
"./jsx-dev-runtime": {
"development": "./esm/react-jsx-dev-runtime.development.mjs",
"production": "./esm/react-jsx-dev-runtime.production.mjs",
"node": {
"import": "./esm/react-jsx-dev-runtime.node.mjs",
"require": "./jsx-dev-runtime.js"
},
"default": "./jsx-dev-runtime.js"
},
"./jsx-runtime": {
"development": "./esm/react-jsx-runtime.development.mjs",
"production": "./esm/react-jsx-runtime.production.mjs",
"node": {
"import": "./esm/react-jsx-runtime.node.mjs",
"require": "./jsx-runtime.js"
},
"default": "./jsx-runtime.js"
},
"./": "./"
},
}
æ°ããesmãã³ãã«ãå¿ èŠã§ãããããŒã«ã¢ããã§è¿œå ããã®ã¯ããã»ã©é£ãããããŸããã
./esm/react.development.mjs
ããã³./esm/react.production.mjs
ãã³ãã«ã«ã¯ã process.env.NODE_ENV
ãã§ãã¯ãå«ãŸããŠããªãå¿
èŠããããŸããexports
ãã£ãŒã«ããä»ããŠè§£æ±ºãããŸããprocess
ã¯ããŒãAPIã§ããããã©ãŠã¶ç°å¢ã§ã¯æå³ããªããããšãã°webpack5ã®_default_ã§ã¯ãµããŒããããŠããŸããã./esm/react.node.mjs
ã¯ã process.env.NODE_ENV
ãã§ãã¯ãä¿æããŸãã--conditions
CLIãã©ã°ãä»ããŠdev / prodãã³ãã«ã«ãªããã€ã³ã§ããŸããexports
ãã£ãŒã«ãããµããŒãããŠããŸããWDYTããããããè¿œå ããã®ã¯ããªãå®å šã ãšæããŸããïŒ
https://webpack.js.org/guides/package-exports/
https://nodejs.org/dist/latest-v15.x/docs/api/packages.html
"./": "./"
ãããšãå®å
šã«ãªããŸãããã«ãã»ã«åãé²æ¢ããããããsemver-majorãã§ãããããã«åé€ããå¿
èŠããããŸãã
FWIW babelã¯ãæ°ããjsxã©ã³ã¿ã€ã ã€ã³ããŒãã次ã®ããã«åºåããŸã
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
ãããããã®ãããªã¢ãžã¥ãŒã«ãNodeã«ããŒããããšããã¡ã€ã«æ¡åŒµåããªããšããæå¥ã衚瀺ãããŸãã
> node .\node.mjs
node:internal/process/esm_loader:74
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'test\node_modules\react\jsx-runtime' imported from test\node_modules\react-data-grid\lib\bundle.js
Did you mean to import react/jsx-runtime.js?
at new NodeError (node:internal/errors:259:15)
at finalizeResolution (node:internal/modules/esm/resolve:307:11)
at moduleResolve (node:internal/modules/esm/resolve:742:10)
at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:853:11)
at Loader.resolve (node:internal/modules/esm/loader:85:40)
at Loader.getModuleJob (node:internal/modules/esm/loader:229:28)
at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:51:40)
at link (node:internal/modules/esm/module_job:50:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
exports
ãè¿œå ãããšä¿®æ£ãããŸãð€
@nstepienã¯ãåã®æçš¿ã§ç€ºããããã«å®å
šãªexports
ããããæäŸããããšã¯ãç§ãä¿¡ããŠããããšããã®éžæè¢ã§ã¯ãããŸããã cjsã®çžäºéçšæ§ãªã©ã«é¢ããŠããŒããå®è£
ãããã®ã¯ãæ¢åã®ãšã³ã·ã¹ãã ã§ã¯å®éã«ã¯ããŸãæ©èœããŸããã ãã¥ã¢ã«ããã±ãŒãžã®å±éºæ§ã¯çŸå®çã§ã-ç¹ã«ããããã®åäžã®ã³ããŒãå¿
èŠãšããReacã®ãããªããã±ãŒãžã®å Žåã
commonjsã®ã¿ã®ãã¡ã€ã«ãå«ãexports
ãããã¯ãäœãå£ããã«è¿œå ã§ããå¯èœæ§ããããŸããããããé©åã«è¡ãããã«ãããã«æ
éã«ãé©åãªe2eãã¹ããå®è¡ããå¿
èŠããããŸãïŒé©åã«åŠçããã®ãã©ãã»ã©è€éããèãããšïŒ
@Andaristããã¯ããŸãæ©èœããreactã®å Žåãéãã¯ãããŸãããããã¯åžžã«ãã®å±éºæ§ãããããšã³ã·ã¹ãã ã¯ãreactãã©ãã§ã
Reactã®ãã¹ãŠã®äŸåé¢ä¿ïŒæšç§»çãã©ããã«é¢ä¿ãªãïŒãReactã®å¶åŸ¡äžã«ããïŒãã®å Žåã¯ããã§ãïŒãããããã¹ãŠã®ESMãšã³ããªãã€ã³ããCJSã³ã³ãã³ããåãšã¯ã¹ããŒãããŠããå Žåã¯ãããã§ã-ãããããã®ç¹å®ã®ã±ãŒã¹ã§ã¯éæå¯èœã§ãã
ESMãšã³ããªã®å®éã®åœ¢ç¶ãã©ãããã¹ããã«ã€ããŠã®ãã©ãå šäœããŸã ãããŸãïŒååä»ããããã©ã«ããäž¡æ¹ïŒïŒ
import React from 'react'
ã䜿çšããŠãããããå®éã«ã¯äžäœäºææ§ããããŸãããããã¯ãESMã䜿çšããŠãããšãã«ããŒãã«Reactãå®éã«ã€ã³ããŒãããå¯äžã®æ¹æ³ã§ããããŸããimport * as React from 'react'
ã䜿çšããŠããã³ãŒãã®å€ãããã¿ã€ããã§ãã«ãŒãä»ã®ããŒã«ã«ãã£ãŠä¿é²ãããŠãããããå®éã«ã¯äžäœäºææ§ã¯ãããŸãããããŒãã®ããã«æããESMã©ãããŒã®å¯èœæ§ãåžžã«å¿ããŠããŸããããã®ææ³ã¯ãã¹ãŠã®äŸåé¢ä¿ãå¶åŸ¡ããå Žåã«
äž¡æ¹ãæäŸããå¯äžã®æ®éçãªæŠç¥ã¯ãå®éã«ã¯ããã¹ãŠã®å®éã®ã³ãŒããCJSã«å ¥ãããã®åšãã«ESMã©ãããŒãèšè¿°ããŠååä»ããšã¯ã¹ããŒããæäŸããããšã§ãã ã¹ããŒããã«ã§ã¯ãªããIDã«äŸåããªãã³ãŒãã¯ãäž¡æ¹ã§ãã€ãã£ãã«èšè¿°ã§ããŸãããããã¯ãµãã»ããã§ããã泚æãå¿ èŠã§ãã
jsx-runtime
ã¯ã¹ããŒããã«ã§ã¯ãããŸãããïŒ ã©ãããŒãªãã§äž¡æ¹ã®esm / cjsãå®å
šã«åºè·ã§ããã¯ãã§ãã
esmããŒãã«react/jsx-runtime
ãã€ã³ããŒãããããã®å¥ã®åé¡ããã°ã«èšé²ããå¿
èŠããããŸããïŒ
ããã³ããšã³ãããã±ãŒãžã®å Žåãè¿œå ã®èª²é¡ããã¥ã¢ã«ã¹ããŒããã¶ãŒãã«å ãããŸãããããããã«ãã³ãã«ãã¶ãŒããšåŒã³ãŸãããã
ESMããã³CJSããŒãžã§ã³ããšã¯ã¹ããŒãããããã±ãŒãžãrequire
ããã³import
ãä»ããŠäœ¿çšãããå Žåãäž¡æ¹ã®ããŒãžã§ã³ããã³ãã«ãããããã±ãŒãžã®æå¹ãã³ãã«ãµã€ãºã2åã«ãªããŸãã
@sokraã¯å®éã«ãããå¯èœã§ããïŒ ããšãã°ãããŒã«ã¢ããã§ã¯ãcjsã¢ãžã¥ãŒã«ãesmã¢ãžã¥ãŒã«ã«å€æãããããã䜿çšå¯èœãªå Žåã¯ãã€ã§ãesmã¢ãžã¥ãŒã«ãã€ã³ããŒãããããšããå§ãããŸãã
å®éã«ã¯ãããŒãã»ãã³ãã£ã¯ã¹ïŒwebpack 5ãªã©ïŒã«åŸããã³ãã©ãŒã§å¯èœã§ããã»ãã³ãã£ã¯ã¹ãäžèŽãããããšãéèŠã§ããããããªããšãããŒãã§å®è¡ããå Žåãšãã³ãã«ã³ãŒããå®è¡ããå Žåã«ç°ãªãçµæãçºçããå¯èœæ§ãããããã§ãã
ãã ããwebpack 5ã¯ãesm / cjsïŒãšã¯ã¹ããŒããããããã®éè€æé€ïŒã«äœ¿çšãããç¹å¥ãª"module"
æ¡ä»¶ãåŠçããŸãã
@ljharbã®ææ¡ãæ€èšãããšãããã¯å®éã«ã¯é¢ä¿ãããŸããããªããªããesmãã¡ã€ã«ã¯cjsãã¡ã€ã«ãåãšã¯ã¹ããŒãããã©ãããŒã³ãŒãã®ã»ãã®æ°è¡ã§ããå¯èœæ§ãããããã§ãã
èãESMã©ãããŒã䜿çšãããšããã³ãã©ãŒã®æç¡ã«ããããããè¿œå ã®å±éºæ§ã¯ãããŸãããã°ã©ãå ã®éè€ã«ã€ããŠãã¢ã®æ åœè ãåé¿ããéåžžã®å±éºæ§ã®ã¿ã§ãã
æãåèã«ãªãã³ã¡ã³ã
ãã2020幎ã«ãªããŸãããå ¬åŒFBããŒã ããã®ã¢ããããŒãã¯ãããŸããïŒ React v17ã§ããã«é¢é£ããå€æŽã¯ãããŸããïŒ