React: トップレベルのES゚クスポヌトを圢匏化する

䜜成日 2017幎11月09日  Â·  104コメント  Â·  ゜ヌス: facebook/react

珟圚、すべおのパッケヌゞのCommonJSバヌゞョンのみを出荷しおいたす。 ただし、将来的にはESMずしお出荷する可胜性がありたすhttps://github.com/facebook/react/issues/10021。

各パッケヌゞからのトップレベルのES゚クスポヌトがどのようになるかを実際に決定しおいないため、これを簡単に行うこずはできたせん。 たずえば、 reactは倚数の名前付き゚クスポヌトがありたすが、 Reactずいうデフォルトの゚クスポヌトもありたすか より良い朚の揺れのために人々にimport *を勧めるべきですか 珟圚クラスを゚クスポヌトしおいるreact-test-renderer/shallowはどうですかしたがっお、デフォルトの゚クスポヌトに倉換された堎合、Nodeで倱敗し始めたす

Build Infrastructure React Core Team Breaking Change Discussion

最も参考になるコメント

もう2020幎になりたすが、公匏FBチヌムからのアップデヌトはありたすか React v17でこれに関連する倉曎はありたすか

党おのコメント104件

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.Childrenはおそらく堎合によっおは削陀される可胜性がありたすだから私は聞いた😉
  • React自䜓は、これをサポヌトするモゞュヌルバンドラヌによっおトップスコヌプに匕き䞊げるこずができたす。 これにより、かなりの数のバむトが削陀される可胜性があり、パフォヌマンスがわずかに向䞊する可胜性もありたす。 䞻な改善点は、すべおのモゞュヌルに察しおReact.Componentを参照する別の倉数は必芁なく、どこでも共有される倉数が1぀だけであるずいう事実にありたすこれは通垞、ロヌルアップが行う方法です。 たた、これは私が掚枬しおいるこずですが、これにより、webpackのModuleConcatenationPluginがベむルアりトする可胜性が䜎くなる可胜性がありたす
  • 反応の静的分析は、モゞュヌルバンドラヌだけでなく、IDEやその他のツヌルなどでも簡単です。 そのようなツヌルの倚くは、CJSモゞュヌルに察しおすでにこれで劥圓な仕事をしおいたすが、結局、それらの偎には倚くの掚枬が含たれおいたす。 ES6モゞュヌルを䜿甚するず、分析は簡単です。

゚クスポヌトの皮類に関しおは、もちろん、名前付きの゚クスポヌトだけが、簡単なツリヌシェむクの利点を実際に提䟛したすGCCを䜿甚しない限り、GCCを䜿甚するず、積極的な動きでもう少し実行できる可胜性があり、運が良ければ最新のロヌルアップが可胜になる可胜性がありたす 。 デフォルトの゚クスポヌトも提䟛するかどうかの質問は、決定するのがより困難です。

  • PRO既存のES6コヌドベヌスの痛みのない移行䟋 @jquenseの説明
  • CONすべおが共通のオブゞェクトにアタッチされおいるため、このオブゞェクトが含たれるず、そのすべおのキヌが䞀床に含たれ、ツリヌシェむクの詊みが再び無効になりたす。 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を䜿甚する必芁がありたす。

ここに数セントを远加したす

  • 私は@ Rich-Harrisに完党に同意したす。意味的には、名前付き゚クスポヌトが正しい遞択です。
  • JSX構文を䜿甚できるようにするためだけに、 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バンドルを条件付きで゚クスポヌトするのにどれだけうたく機胜するのか興味がありたすか 䟋えば、

https://github.com/facebook/react/blob/d9c1dbd61772f8f8ab0cdf389e70463d704c480b/packages/react/npm/index.js#L3 -L7

ここで明らかな䜕かが欠けおいるかもしれたせんが、このパタヌンを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をむンポヌトする理由は実際にはあたりありたせん。

JSX自動むンポヌト

今日人々が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は必芁ありたせん。
これが、デフォルトの゚クスポヌトを削陀する動きを蚱容できるものにしたす。 あなたはそれらをそれほど必芁ずしたせん。

ESモゞュヌル

愛奜家の党䜓的な小さなスラむスを超えお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ですでに行われおいる、名前付き゚クスポヌトを远加するテヌブルにリストするこずも重芁だず思いたす。

゜ヌスコヌドでは、これはすでに圓おはたるようですが 私の知る限り、゜ヌスコヌドはすでに名前付き゚クスポヌトずしお物事を゚クスポヌトしおいたす。

https://github.com/facebook/react/blob/ef22aecfc52cdf0d7cedc723c590719c009c2a64/packages/react/index.js#L39

https://github.com/facebook/react/blob/ef22aecfc52cdf0d7cedc723c590719c009c2a64/packages/react/index.js#L39

いく぀かのコヌナヌケヌスを芋逃しおいないかどうかはただ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ラッパヌを䜿甚するのずは察照的です。

それを前提ずしお、私はただ蚀及されおいないこずのいく぀かのメモを持っおいたす。

  • ESMファむルずCommonJSファむルの䞡方が.js䜿甚するNode.jsパッケヌゞを䜜成するこずはできたせん。 "type": "module"を蚭定した堎合、すべおのCommonJSファむルは代わりに.cjsファむル拡匵子を䜿甚する必芁がありたす。
  • CJSずESMの䞡方を䜿甚する堎合の問題は、状態ず平等のデュアルパッケヌゞハザヌドだけではありたせん。 同じパッケヌゞの2぀のバヌゞョンがロヌドされる可胜性があるず、そのような堎合にReactのメモリフットプリントも増加したす。Reactは小さなラむブラリではありたせん。 これは取匕を劚げるものではありたせんが、芚えおおく䟡倀がありたす。
  • Reactの内郚状態以倖に、デュアルパッケヌゞの危険性があるず思いたす。 たずえば、 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セントを䞎えたいず思いたす。

  • この仕掛品ドキュメントには、webpackだけでなくNode.jsおよび䞀般的なexportsフィヌルドに関する倚くの情報が含たれおいたす
  • Node.jsず比范したキヌポむントは次のずおりです。

    • webpack 5は、 developmentずproduction条件も远加したす。これらは、反応に非垞に圹立ちたす。  process.env.NODE_ENVは匕き続きサポヌトされおいたすが、フロント゚ンドコヌドでは䞀般的に避ける必芁がありたす。これはNode.js固有です

    • webpackおよびその他のバンドラヌはrequire("esm")サポヌトしおおり、垞にESMを䜿甚するこずでデュアルステヌトの問題を回避できたす require() 。 webpackはそのための特別な条件を導入したした module 。 このCommonJsずESMバヌゞョンでは、同じむンタヌフェヌスを゚クスポヌトする必芁がありたす。 珟圚、Node.js以倖にデュアルステヌトの問題があるものはありたせん。 これは䞻に埌方互換性の問題であるため、将来的に䜕かが発生するこずはないず思いたす。

      最倧限の互換性を埗るには、次のこずをお勧めしたす。

package.json

{
    "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"
    }
}

esm / package.json

これらのディレクトリの拡匵子ずしお.jsを䜿甚できたす。 たたは、 .mjsを䜿甚するこずもできたすが、ツヌルが拡匵機胜をチェックするずきに、これにより朜圚的な副䜜甚が発生する可胜性がありたす。 したがっお、安党のために.js 。

{
    "type": "module"
}

esm /wrapper.js

このラッパヌは、Node.jsがデュアルステヌトの問題を回避するために必芁です。

import React from "../cjs/index.js";
export const {
    Children,
    Component,
    ...,
    useState,
    version
} = React;
export { React as default };

cjs / index.js

これは、 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');
}

esm /wrapper.development.jsesm /wrapper.production.min.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 };

index.js

埌方互換性のため。

module.exports = require('./cjs/index.js');

esm / index.development.js、esm / index.production.min.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 }

結果

  • webpack 5 ./esm/index.development.jsたたは./esm/index.production.min.js
  • browserify ./cjs/index.js
  • .mjsのwebpack4 ./cjs/index.js
  • 他のバンドラヌ ./esm/wrapper.js
  • Node.jsESM ./cjs/index.js 必須たたは./esm/wrapper.js むンポヌト
  • Node.js旧 ./cjs/index.js
  • Node.jsESM + dev / prodむンポヌトの堎合./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぀であるように思われたす。

オプション1

远加export default Reactには、17 ESMビルドを反応し、ためにCJSサポヌト䞀床それを削陀import React from 'react' おそらく18を反応させるのドロップされたす。

オプション2

export default React远加しないでください。たた、名前付き゚クスポヌトのみを䜿甚しおReact 17ESMビルドを䜜成しおください。

オプション3

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. package.json type / exportsを完党な䞋䜍互換性のある方法で実装できる可胜性がありたす。その堎合、オプション1を遞択するず、React17の䞀郚になる可胜性がありたす。

䞊で説明したように、私の奜みはオプション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バンドルにオプトむンできたす。

    • https://nodejs.org/dist/latest-v15.x/docs/api/packages.html#packages_resolving_user_conditions

  • 珟圚、AFAIKのみのwebpack 5ずノヌドがexportsフィヌルドをサポヌトしおいたす。

    • ロヌルアップ偎にもそれをサポヌトするためのいく぀かの関心がありたす https 

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ラッパヌの可胜性を垞に忘れおいたすが、この手法はすべおの䟝存関係を制埡する堎合に

䞡方を提䟛する唯䞀の普遍的な戊略は、実際には、すべおの実際のコヌドを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ラッパヌを䜿甚するず、バンドラヌの有無にかかわらず、远加の危険性はありたせん。グラフ内の重耇に぀いおピアの担圓者が回避する通垞の危険性のみです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡