このプロジェクトは、Create Reactアプリでブートストラップされました。
以下に、一般的なタスクの実行方法に関する情報があります。
このガイドの最新バージョンはこちらをご覧ください。
<title>publicフォルダーを使用しますpublicフォルダーを使用するタイミング.envに開発環境変数を追加します<meta>タグを生成しますnpm start変更を検出しませんnpm test Macos Sierraでハングまたはクラッシュしますnpm run build Exitsが早すぎますnpm run build Herokuで失敗しますnpm run buildマイニル化に失敗しますCreate Reactアプリは2つのパッケージに分割されます。
create-react-app新しいプロジェクトの作成に使用するグローバルコマンドラインユーティリティです。react-scripts生成されたプロジェクト(これを含む)の開発依存関係です。 create-react-app自体を更新する必要はほとんどありません。すべてのセットアップをreact-scriptsに委任します。
create-react-app実行すると、最新バージョンのreact-scriptsを使用して常にプロジェクトを作成するため、新たに作成されたアプリのすべての新機能と改善が自動的に取得されます。
既存のプロジェクトを新しいバージョンのreact-scriptsに更新するには、Changelogを開き、現在オンになっているバージョンを見つけます(わからない場合は、このフォルダーでpackage.jsonチェックしてください)。バージョン。
ほとんどの場合、 package.jsonでreact-scriptsバージョンをぶつけ、このフォルダーでnpm install (またはyarn install )を実行するだけで十分ですが、潜在的な壊れた変化についてはChangelogを参照することは良いことです。
私たちはreact-scripts痛みを伴わないアップグレードできるように、壊れた変更を最小限に抑えることを約束します。
私たちは常にあなたのフィードバックを受け入れています。
作成後、プロジェクトは次のようになります。
my-app/
README.md
node_modules/
package.json
public/
index.html
favicon.ico
src/
App.css
App.js
App.test.js
index.css
index.js
logo.svg
プロジェクトを構築するには、これらのファイルが正確なファイル名で存在する必要があります。
public/index.htmlはページテンプレートです。src/index.jsはJavaScriptエントリポイントです。他のファイルを削除または名前変更できます。
src内にサブディレクトリを作成できます。より高速な再構築のために、 src内のファイルのみがWebpackで処理されます。
JSおよびCSSファイルをsrc内に配置する必要があります。そうしないと、Webpackが表示されません。
public public/index.htmlから使用できます。
JavaScriptとHTMLの資産を使用するための手順を以下にお読みください。
ただし、より多くのトップレベルのディレクトリを作成できます。
それらはプロダクションビルドに含まれていないため、ドキュメントのようなものに使用できます。
プロジェクトディレクトリでは、実行できます。
npm start開発モードでアプリを実行します。
http:// localhost:3000を開いて、ブラウザで表示します。
編集すると、ページがリロードされます。
また、コンソールに糸くずエラーも表示されます。
npm testインタラクティブウォッチモードでテストランナーを起動します。
詳細については、実行中のテストに関するセクションを参照してください。
npm run build buildフォルダーへの生産用のアプリをビルドします。
生産モードで反応することを正しくバンドルし、最高のパフォーマンスのためにビルドを最適化します。
ビルドが縮小され、ファイル名にはハッシュが含まれます。
あなたのアプリは展開する準備ができています!
詳細については、展開に関するセクションを参照してください。
npm run eject注:これは一方向の操作です。 ejectたら、戻ることができません!
ビルドツールと構成の選択に満足していない場合は、いつでもejectできます。このコマンドは、プロジェクトから単一のビルド依存関係を削除します。
代わりに、すべての構成ファイルと推移的依存関係(Webpack、Babel、Eslintなど)をプロジェクトにコピーして、それらを完全に制御できるようになります。 ejectを除くすべてのコマンドは引き続き機能しますが、それらを調整できるようにコピーされたスクリプトを指します。この時点で、あなたはあなた自身です。
ejectを使用する必要はありません。キュレーションされた機能セットは、小規模および中央の展開に適しているため、この機能を使用する義務を感じるべきではありません。ただし、準備ができたときにカスタマイズできなかった場合、このツールは役に立たないことを理解しています。
デフォルトでは、生成されたプロジェクトはすべての最新のブラウザをサポートします。
Internet Explorer 9、10、および11のサポートには、ポリフィルが必要です。
このプロジェクトは、最新のJavaScript規格のスーパーセットをサポートしています。
ES6構文機能に加えて、次のこともサポートしています。
さまざまな提案段階の詳細をご覧ください。
実験的な提案を慎重に使用することをお勧めしますが、Facebookはこれらの機能を製品コードで頻繁に使用しているため、これらの提案のいずれかが将来変更された場合はCodeModsを提供する予定です。
このプロジェクトには、デフォルトでポリフィルが含まれていないことに注意してください。
ランタイムサポート( Array.from()やSymbolなど)が必要な他のES6+機能を使用している場合は、適切なポリフィルを手動で含めること、またはターゲットにしているブラウザがすでにサポートしていることを確認してください。
お気に入りのテキストエディターで強調表示を構成するには、関連するBabelドキュメントページにアクセスして、指示に従ってください。最も人気のある編集者の一部がカバーされています。
注:この機能は、
[email protected]以上で利用できます。
また、NPM 3以上でのみ動作します。
崇高なテキスト、アトム、ビジュアルスタジオコードなどの一部の編集者は、ESLINTのプラグインを提供します。
糸くずには必要ありません。ターミナルとブラウザコンソールにリナーの出力がすぐに表示されるはずです。ただし、エディターに糸くずの結果を右に表示することを好む場合は、できる余分な手順があります。
最初にエディター用のESLINTプラグインをインストールする必要があります。次に、プロジェクトルートに.eslintrcというファイルを追加します。
{
"extends" : "react-app"
}これで、編集者は糸くずの警告を報告する必要があります。
.eslintrcファイルをさらに編集したとしても、これらの変更はエディター統合にのみ影響することに注意してください。それらは、ターミナルおよびブラウザー内のリント出力に影響しません。これは、Create Reactアプリが一般的な間違いを見つける最小限のルールセットを意図的に提供するためです。
プロジェクトのコーディングスタイルを実施したい場合は、Eslintスタイルのルールではなく、きれいなものを使用することを検討してください。
この機能は現在、Visual StudioコードとWebStormでのみサポートされています。
Visual StudioコードとWebstormは、Create Reactアプリを使用してボックスからデバッグをサポートしています。これにより、開発者としてエディターを離れることなくReactコードを作成およびデバッグできます。最も重要なことは、ツールを切り替える必要がないため、コンテキストの切り替えが最小限である継続的な開発ワークフローを使用することができます。
VSコードとVSコードクロームデバッガー拡張機能の最新バージョンをインストールする必要があります。
次に、下のブロックをlaunch.jsonファイルに追加し、アプリのルートディレクトリの.vscodeフォルダー内に配置します。
{
"version" : " 0.2.0 " ,
"configurations" : [
{
"name" : " Chrome " ,
"type" : " chrome " ,
"request" : " launch " ,
"url" : " http://localhost:3000 " ,
"webRoot" : " ${workspaceRoot}/src " ,
"sourceMapPathOverrides" : {
"webpack:///src/*" : " ${webRoot}/* "
}
}
]
}注:ホストまたはポート環境の変数を介して調整を行った場合、URLは異なる場合があります。
npm startを実行してアプリを起動し、 F5を押すか、グリーンデバッグアイコンをクリックしてVSコードでデバッグを開始します。これで、コードを作成し、ブレークポイントを設定し、コードを変更し、新しく変更されたコードをデバッグすることができます。
VSコードのデバッグに問題がありますか?トラブルシューティングガイドをご覧ください。
WebStormおよびJetBrains IDEサポートChrome Extensionをインストールする必要があります。
Webstorm RunでEdit Configurations...次に、 +をクリックしてJavaScript Debugを選択します。 http://localhost:3000 URLフィールドに貼り付けて構成を保存します。
注:ホストまたはポート環境の変数を介して調整を行った場合、URLは異なる場合があります。
npm startを実行してアプリを起動し、WindowsとLinuxでMacOSまたはF9を押して^Dを押すか、Green DebugアイコンをクリックしてWebStormでデバッグを開始します。
同じ方法で、Intellij Idea Ultimate、Phpstorm、Pycharm Pro、およびRubymineでアプリケーションをデバッグできます。
Prettierは、JavaScript、CSS、JSONをサポートする意見のコードフォーマッタです。きれいにすると、記述したコードを自動的にフォーマットして、プロジェクト内のコードスタイルを確保できます。詳細については、PrettierのGitHubページをご覧ください。このページをご覧になってアクションを確認してください。
Gitでコミットするたびにコードをフォーマットするには、次の依存関係をインストールする必要があります。
npm install --save husky lint-staged prettierまたは、 yarnを使用することもできます。
yarn add husky lint-staged prettierhusky 、まるでGithooksがNPMスクリプトであるかのように簡単に使用できます。lint-staged使用すると、GITで段階的なファイルでスクリプトを実行できます。 Lint Stagedに関するこのブログ投稿をご覧ください。prettier 、私たちがコミットする前に実行するJavaScriptのフォーマッタです。これで、プロジェクトルートのpackage.jsonに数行を追加することにより、すべてのファイルが正しくフォーマットされていることを確認できます。
次のフィールドをpackage.jsonセクションに追加します。
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ }次に、「Lintステージ」フィールドをpackage.jsonに追加します。たとえば
"dependencies": {
// ...
},
+ "lint-staged": {
+ "src/**/*.{js,jsx,json,css}": [
+ "prettier --single-quote --write",
+ "git add"
+ ]
+ },
"scripts": {これで、コミットするたびに、Prettierは変更されたファイルを自動的にフォーマットします。 ./node_modules/.bin/prettier --single-quote --write "src/**/*.{js,jsx}"を実行して、プロジェクト全体を初めてフォーマットすることもできます。
次に、お気に入りの編集者にきれいを統合することをお勧めします。きれいなGitHubページのエディター統合のセクションをお読みください。
<title>生成されたプロジェクトのpublicフォルダーにソースHTMLファイルを見つけることができます。タイトルを「React App」から他のものに変更するために、 <title>タグを編集することができます。
通常、 publicフォルダー内のファイルを頻繁に編集しないことに注意してください。たとえば、StyleSheetの追加は、HTMLに触れずに行われます。
コンテンツに基づいてページタイトルを動的に更新する必要がある場合は、browser document.title APIを使用できます。より複雑なシナリオについては、Reactコンポーネントからタイトルを変更する場合は、サードパーティライブラリであるReactヘルメットを使用できます。
プロダクションでアプリにカスタムサーバーを使用し、ブラウザに送信される前にタイトルを変更する場合は、このセクションでアドバイスをフォローできます。または、各ページを静的HTMLファイルとして事前にビルドすることができます。これにより、ここでカバーされているJavaScriptバンドルがロードされます。
生成されたプロジェクトには、依存関係としてのReactおよびReactdomが含まれます。また、開発依存関係としてCreate Reactアプリで使用される一連のスクリプトも含まれています。 npmで他の依存関係(たとえば、Reactルーター)をインストールできます。
npm install --save react-router-domまたは、 yarnを使用することもできます。
yarn add react-router-domこれはreact-router-domだけでなく、どのライブラリでも機能します。
このプロジェクトのセットアップは、WebpackのおかげでES6モジュールをサポートしています。
require()とmodule.exportsを使用することもできますが、代わりにimportとexportを使用することをお勧めします。
例えば:
Button.js import React , { Component } from 'react' ;
class Button extends Component {
render ( ) {
// ...
}
}
export default Button ; // Don’t forget to use export default!DangerButton.js import React , { Component } from 'react' ;
import Button from './Button' ; // Import a component from another file
class DangerButton extends Component {
render ( ) {
return < Button color = "red" / > ;
}
}
export default DangerButton ;デフォルトと名前付きエクスポートの違いに注意してください。それは間違いの一般的な源です。
モジュールが単一のもの(コンポーネントなど)のみをエクスポートする場合、デフォルトのインポートとエクスポートの使用に固執することをお勧めします。 「./button」からexport default Button 、 import Button from './Button'使用すると、これが得られます。
名前付きエクスポートは、いくつかの機能をエクスポートするユーティリティモジュールに役立ちます。モジュールには、せいぜい1つのデフォルトエクスポートと、好きなだけ多くの名前付きエクスポートがあります。
ES6モジュールの詳細については、
ユーザーが使用する前にアプリ全体をダウンロードする代わりに、コード分割を使用すると、コードを小さなチャンクに分割し、オンデマンドで読み込むことができます。
このプロジェクトのセットアップは、Dynamic import()を介してコード分割をサポートします。その提案はステージ3にあります。 import()関数のようなフォームは、モジュール名を引数として受け取り、モジュールの名前空間オブジェクトに常に解決するPromiseを返します。
これが例です:
moduleA.js const moduleA = 'Hello' ;
export { moduleA } ;App.js import React , { Component } from 'react' ;
class App extends Component {
handleClick = ( ) => {
import ( './moduleA' )
. then ( ( { moduleA } ) => {
// Use moduleA
} )
. catch ( err => {
// Handle failure
} ) ;
} ;
render ( ) {
return (
< div >
< button onClick = { this . handleClick } > Load < / button >
< / div >
) ;
}
}
export default App ;これにより、ユーザーが[ロード]ボタンをクリックした後にのみロードされる個別のチャンクとして、 moduleA.jsおよびそのすべての依存関係が個別のチャンクとしてなります。
必要に応じて、 async / async / await syntaxで使用することもできます。
Reactルーターを使用している場合は、コード分割を使用する方法に関するこのチュートリアルをご覧ください。コンパニオンGithubリポジトリはこちらをご覧ください。
また、Reactドキュメントのコード分割セクションをご覧ください。
このプロジェクトのセットアップでは、すべての資産を処理するためにWebpackを使用しています。 Webpackは、JavaScriptを超えてimportの概念を「拡張」するカスタム方法を提供します。 JavaScriptファイルがCSSファイルに依存することを表現するには、 JavaScriptファイルからCSSをインポートする必要があります。
Button.css. Button {
padding : 20 px ;
}Button.js import React , { Component } from 'react' ;
import './Button.css' ; // Tell Webpack that Button.js uses these styles
class Button extends Component {
render ( ) {
// You can use them as regular CSS styles
return < div className = "Button" / > ;
}
}これはReactに必要ではありませんが、多くの人がこの機能を便利だと感じています。このアプローチの利点については、こちらをご覧ください。ただし、これにより、コードがWebpackよりも他のビルドツールや環境に対するポータブルを低下させることに注意する必要があります。
開発では、このように依存関係を表現することで、スタイルを編集する際にスタイルをその場でリロードできます。生産では、すべてのCSSファイルは、ビルド出力の単一のミニ型.cssファイルに連結されます。
Webpack固有のセマンティクスの使用が懸念される場合は、すべてのCSSをsrc/index.cssに直接配置できます。 src/index.jsからインポートされますが、後で別のビルドツールに移行した場合は、常にそのインポートを削除できます。
注:この機能は、
[email protected]以降で利用できます。
このプロジェクトは[name].module.cssファイルネーミングコンベンションを使用して、通常のスタイルシートとともにCSSモジュールをサポートします。 CSSモジュールは、フォーマット[filename]_[classname]__[hash]の一意のクラス名を自動的に作成することにより、CSSのスコープを可能にします。
ヒント: SASSを使用してスタイルシートを前処理する必要がある場合は、インストールの指示に従って、次のようにStyleSheetファイルの拡張子を変更してください。
[name].module.scssまたは[name].module.sass。
CSSモジュールでは、衝突の名前を心配することなく、異なるファイルで同じCSSクラス名を使用できます。 CSSモジュールの詳細については、こちらをご覧ください。
Button.module.css. error {
background-color : red;
}another-stylesheet.css. error {
color : red;
}Button.js import React , { Component } from 'react' ;
import styles from './Button.module.css' ; // Import css modules stylesheet as styles
import './another-stylesheet.css' ; // Import regular stylesheet
class Button extends Component {
render ( ) {
// reference as a js object
return < button className = { styles . error } > Error Button < / button > ;
}
}他の.errorクラス名からの衝突はありません
<!-- This button has red background but not red text -->
< button class =" Button_error_ax7yz " > </ div >これはオプションの機能です。通常の<link> styleSheetsおよびCSSファイルは完全にサポートされています。 CSSモジュールは、 .module.css拡張機能で終了するファイルに対してオンになります。
注:この機能は、
[email protected]以降で利用できます。
一般的に、異なるコンポーネントで同じCSSクラスを再利用しないことをお勧めします。たとえば、 <AcceptButton>および<RejectButton>コンポーネントで.Button CSSクラスを使用する代わりに、独自の.Buttonスタイルを使用して<Button>コンポーネント<AcceptButton>作成することをお勧めし<RejectButton> 。継承)。
このルールに従って、ミックスやネストなどの機能はコンポーネントの構成に置き換えられるため、CSSのプレ前セッサーはそれほど有用ではありません。ただし、価値があると思う場合は、CSSプリプロセッサを統合できます。
SASSを使用するには、最初にnode-sassをインストールします。
$ npm install node-sass --save
$ # or
$ yarn add node-sassこれで、 src/App.cssをsrc/App.scssに変更し、 src/App.jsを更新してsrc/App.scssをインポートできます。このファイルとその他のファイルは、拡張機能.scssまたは.sassでインポートされた場合、自動的にコンパイルされます。
SASSファイル間で変数を共有するには、SASSインポートを使用できます。たとえば、 src/App.scssおよびその他のコンポーネントスタイルファイルには、 @import "./shared.scss";可変定義を備えています。
これにより、ような輸入品を行うことができます
@import ' styles/_colors.scss ' ; // assuming a styles directory under src/
@import ' ~nprogress/nprogress ' ; // importing a css file from the nprogress node moduleヒント: CSSモジュールでもこの機能を使用することを選択できます!
注:
node_modulesからのインポートは、上記のように~でインポートする必要があります。
このプロジェクトのセットアップはCSSを模倣し、Autoprefixerを介してベンダーのプレフィックスを自動的に追加するため、心配する必要はありません。
allプロパティ、 breakプロパティ、カスタムプロパティ、メディアクエリ範囲などの新しいCSS機能のサポートは、古いブラウザーのサポートを追加するために自動的にポリフィルされています。
browserslistキーをpackage.json ACCORINCEに調整することにより、ターゲットサポートブラウザをカスタマイズできます。
たとえば、これ:
. App {
display : flex;
flex-direction : row;
align-items : center;
}これになります:
. App {
display : -webkit-box;
display : -ms-flexbox;
display : flex;
-webkit-box-orient : horizontal;
-webkit-box-direction : normal;
-ms-flex-direction : row;
flex-direction : row;
-webkit-box-align : center;
-ms-flex-align : center;
align-items : center;
}何らかの理由でオートプレフィックスを無効にする必要がある場合は、このセクションに従ってください。
CSSグリッドレイアウトのプレフィックスはデフォルトで無効になっていますが、手動のプレフィックスを剥がしません。 CSSグリッドのプレフィックスにオプトインしたい場合は、まずその制限について慣れてください。
CSSグリッドプレフィックスを有効にするには、 /* autoprefixer grid: on */を追加します。
Webpackを使用すると、画像やフォントなどの静的資産を使用して、CSSと同様に機能します。
JavaScriptモジュールでファイルを正しくimportできます。これにより、Webpackにそのファイルをバンドルに含めるように指示されます。 CSSのインポートとは異なり、ファイルをインポートすると文字列値が得られます。この値は、たとえば、画像のsrc属性またはPDFへのリンクのhrefとして、コードで参照できる最終パスです。
サーバーへの要求の数を減らすために、10,000バイト未満の画像をインポートすると、パスの代わりにデータURIが返されます。これは、BMP、GIF、JPG、JPEG、およびPNGのファイル拡張機能に適用されます。 SVGファイルは#1153のため除外されます。
これが例です:
import React from 'react' ;
import logo from './logo.png' ; // Tell Webpack this JS file uses this image
console . log ( logo ) ; // /logo.84287d09.png
function Header ( ) {
// Import result is the URL of your image
return < img src = { logo } alt = "Logo" / > ;
}
export default Header ;これにより、プロジェクトが構築されると、Webpackが画像をビルドフォルダーに正しく移動し、正しいパスを提供することが保証されます。
これはCSSでも機能します:
. Logo {
background-image : url (. / logo.png);
} WebPackは、CSSのすべての相対モジュール参照を見つけ( ./で開始)、コンパイルされたバンドルからの最終パスに置き換えます。タイプミスを作成したり、重要なファイルを誤って削除したりすると、存在しないJavaScriptモジュールをインポートするときと同じように、コンピレーションエラーが表示されます。コンパイルされたバンドルの最後のファイル名は、コンテンツハッシュからWebpackによって生成されます。ファイルのコンテンツが将来変更された場合、Webpackは生産で異なる名前を与えるため、資産の長期的なキャッシングについて心配する必要はありません。
これはWebpackのカスタム機能でもあることをお勧めします。
Reactには必要ありませんが、多くの人がそれを楽しんでいます(React Nativeは画像に同様のメカニズムを使用します)。
静的資産を処理する別の方法については、次のセクションで説明します。
注:この機能は、
[email protected]以降で利用できます。
SVGファイルを追加する1つの方法については、上記のセクションで説明しました。また、SVGを反応成分として直接インポートすることもできます。 2つのアプローチのいずれかを使用できます。あなたのコードでは、次のようになります。
import { ReactComponent as Logo } from './logo.svg' ;
const App = ( ) => (
< div >
{ /* Logo is an actual React component */ }
< Logo / >
< / div >
) ;これは、SVGを別のファイルとしてロードしたくない場合に便利です。輸入の巻き毛を忘れないでください! ReactComponentインポート名は特別であり、FilenameではなくSVGをレンダリングするReactコンポーネントが必要であることをCreate Reactアプリに伝えます。
publicフォルダーを使用します注:この機能は、
[email protected]以上で利用できます。
publicフォルダーにはHTMLファイルが含まれているため、たとえばページタイトルを設定するために微調整できます。コンパイルされたコードを使用した<script>タグは、ビルドプロセス中に自動的に追加されます。
publicフォルダーに他の資産を追加することもできます。
通常、代わりにJavaScriptファイルに資産importことをお勧めします。たとえば、スタイルシートの追加と画像とフォントの追加に関するセクションを参照してください。このメカニズムは多くの利点を提供します。
ただし、モジュールシステムの外側に資産を追加するために使用できるエスケープハッチがあります。
ファイルをpublicフォルダーに入れた場合、Webpackで処理されません。代わりに、ビルドフォルダーにコピーされません。 publicフォルダー内の資産を参照するには、 PUBLIC_URLと呼ばれる特別な変数を使用する必要があります。
Inside index.htmlは、次のように使用できます。
< link rel =" shortcut icon " href =" %PUBLIC_URL%/favicon.ico " > publicフォルダー内のファイルのみが%PUBLIC_URL%プレフィックスでアクセスできます。 srcまたはnode_modulesのファイルを使用する必要がある場合は、このファイルをビルドの一部にする意図を明示的に指定するためにコピーする必要があります。
npm run build実行すると、Create React Appは、クライアント側のルーティングを使用したり、非ルートURLでホストしたりしても、プロジェクトが機能するため、正しい絶対パスに%PUBLIC_URL%を置き換えます。
JavaScriptコードでは、 process.env.PUBLIC_URL使用して同様の目的で使用できます。
render ( ) {
// Note: this is an escape hatch and should be used sparingly!
// Normally we recommend using `import` for getting asset URLs
// as described in “Adding Images and Fonts” above this section.
return < img src = { process . env . PUBLIC_URL + '/img/logo.png' } / > ;
}このアプローチの欠点に留意してください。
publicフォルダー内のファイルはいずれも、後処理または削除されません。publicフォルダーを使用するタイミング通常、JavaScriptからスタイルシート、画像、フォントをインポートすることをお勧めします。 publicフォルダーは、あまり一般的ではない多くのケースの回避策として役立ちます。
manifest.webmanifestなど、ビルド出力に特定の名前を持つファイルが必要です。pace.jsのような小さなスクリプトを含めます。<script>タグとして含める以外に他の選択肢はありません。グローバル変数を宣言する<script>を追加する場合、それらを使用することに関する次のセクションも読む必要があることに注意してください。
グローバル変数を定義するHTMLファイルにスクリプトを含めると、これらの変数のいずれかをコードで使用しようとすると、変数の定義が表示されないため、リナーは文句を言います。
これを避けることができます。たとえば、 windowオブジェクトからグローバル変数を明示的に読み取ることができます。
const $ = window . $ ;これにより、タイプミスのためではなく、意図的にグローバル変数を使用していることが明らかになります。
または、 // eslint-disable-lineを追加することにより、リナーに任意のラインを無視するように強制することができます。
ReactStrapをReactと一緒に使用する必要はありませんが、BootstrapをReactアプリと統合するための人気のライブラリです。必要な場合は、これらの手順に従って、Create Reactアプリと統合することができます。
NPMからReactStrapとBootstrapをインストールします。 ReactStrapにはBootstrap CSSが含まれていないため、これもインストールする必要があります。
npm install --save reactstrap bootstrap@4または、 yarnを使用することもできます。
yarn add bootstrap@4 reactstrap src/index.jsファイルの先頭にブートストラップCSSとオプションでブートストラップテーマCSSをインポートします。
import 'bootstrap/dist/css/bootstrap.css' ;
// Put any other imports below so that CSS from your
// components takes precedence over default styles. src/App.jsファイルまたはカスタムコンポーネントファイル内の必要なReactSTRAPコンポーネントをインポートします。
import { Button } from 'reactstrap' ;これで、レンダリング方法で定義されているコンポーネント階層内のインポートされたReactSTRAPコンポーネントを使用する準備ができました。以下は、ReactStrapを使用してApp.js例です。
注:この機能は、
[email protected]以降で利用できます。
ブートストラップ(または同等のパッケージ)の視覚的なスタイルを微調整する必要がある場合があります。
[email protected]の時点で、 .scssファイルをインポートできます。これにより、グローバルスタイルの好みに合わせてパッケージの組み込みのSASS変数を使用できます。
ブートストラップをカスタマイズするには、 src/custom.scss (または類似)というファイルを作成し、ブートストラップソースStyleSheetをインポートします。インポートされたファイルの前にオーバーライドを追加します。利用可能な変数の名前については、Bootstrapのドキュメントを参照できます。
// Override default variables before the import
$body-bg : #000 ;
// Import Bootstrap and its default variables
@import ' ~bootstrap/scss/bootstrap.scss ' ;注:
node_modulesからのインポートは、上記のように~でインポートする必要があります。
最後に、 src/index.jsファイルの先頭にデフォルトのbootstrap .cssの代わりに、新しく作成された.scssファイルをインポートします。たとえば
import './custom.scss' ; Flowは、バグが少ないコードを作成するのに役立つ静的タイプチェッカーです。このコンセプトが初めての場合は、JavaScriptで静的タイプを使用するこの紹介をご覧ください。
Flow Workの最近のバージョンは、Create React Appプロジェクトを箱から出しています。
Create Reactアプリプロジェクトにフローを追加するには、次の手順に従ってください。
npm install --save flow-bin (またはyarn add flow-bin )。"flow": "flow"をpackage.jsonのscriptsセクションに追加します。npm run flow init (またはyarn flow init )を実行して、ルートディレクトリに.flowconfigファイルを作成します。// @flowを追加します(たとえば、 src/App.jsに)。これで、 npm run flow (またはyarn flow )を実行して、タイプエラーのファイルを確認できます。オプションで、より良い統合エクスペリエンスを得るために、核種のようなIDEを使用できます。将来的には、Create Reactアプリにさらに密接に統合する予定です。
Flowの詳細については、そのドキュメントをご覧ください。
リレーは、GraphQLを搭載したデータ駆動型のReactアプリケーションを構築するためのフレームワークです。リレーの現在のリリース候補は、Babel Macrosを使用して、Create React Appプロジェクトを箱から出して動作します。リレードキュメントにレイアウトされているようにプロジェクトを設定するだけで、マクロを提供するバベルプラグインのバージョンがあることを確認してください。
それを追加するには、実行してください:
npm install --save --dev babel-plugin-relay@devまたは、 yarnを使用することもできます。
yarn upgrade babel-plugin-relay@dev次に、 graphqlテンプレートタグを使用する場所であれば、マクロをインポートします。
import graphql from 'babel-plugin-relay/macro' ;
// instead of:
// import { graphql } from "babel-plugin-relay"
graphql `
query UserQuery {
viewer {
id
}
}
` ;リレーの詳細については、そのドキュメントをご覧ください。
Create Reactアプリは特定のルーティングソリューションを処方しませんが、Reactルーターが最も人気のあるものです。
それを追加するには、実行してください:
npm install --save react-router-domまたは、 yarnを使用することもできます。
yarn add react-router-dom試してみるには、 src/App.jsのすべてのコードを削除し、そのWebサイトのいずれかの例に置き換えます。基本的な例は、始めるのに適した場所です。
アプリを展開する前に、クライアント側のルーティングをサポートするように制作サーバーを構成する必要がある場合があることに注意してください。
注:この機能は、
[email protected]以上で利用できます。
プロジェクトは、JSファイルでローカルに宣言されているかのように、環境で宣言された変数を消費できます。デフォルトでは、 NODE_ENVが定義されており、 REACT_APP_から始まる他の環境変数が定義されます。
環境変数は、ビルド時間中に埋め込まれます。 Create React Appは静的HTML/CSS/JSバンドルを生成するため、実行時に読み取ることはできません。実行時にそれらを読み取るには、ここに記載されているように、サーバー上のメモリにHTMLをメモリにロードし、ランタイムでプレースホルダーを置き換える必要があります。または、サーバー上のアプリを変更するたびに再構築することもできます。
注:
REACT_APP_から始まるカスタム環境変数を作成する必要があります。NODE_ENVを除く他の変数は、同じ名前を持つ可能性のあるマシン上の秘密鍵を誤って公開しないように無視されます。環境変数を変更するには、開発サーバーが実行されている場合は、開発サーバーを再起動する必要があります。
これらの環境変数は、 process.envで定義されます。たとえば、 REACT_APP_SECRET_CODEという名前の環境変数を使用すると、jsでprocess.env.REACT_APP_SECRET_CODEとして公開されます。
NODE_ENVと呼ばれる特別な内蔵環境変数もあります。 process.env.NODE_ENVから読むことができます。 npm start実行すると、常に'development'と等しくなりますnpm test実行すると、常に'test'と等しくなり、 npm run build実行して生産バンドルを作成すると、常に'production'と等しくなります。 。 NODE_ENV手動でオーバーライドすることはできません。これにより、開発者は誤って開発ビルドを生産に展開することができなくなります。
これらの環境変数は、プロジェクトが展開されている場所に基づいて条件付きで情報を表示したり、バージョンコントロール以外に存在する機密データを消費したりするのに役立ちます。
まず、環境変数を定義する必要があります。たとえば、 <form>内の環境で定義されている秘密を消費したいとしたとしましょう。
render ( ) {
return (
< div >
< small > You are running this application in < b > { process . env . NODE_ENV } < / b > mode. < / small >
< form >
< input type = "hidden" defaultValue = { process . env . REACT_APP_SECRET_CODE } / >
< / form >
< / div >
) ;
}ビルド中、 process.env.REACT_APP_SECRET_CODE 、 REACT_APP_SECRET_CODE環境変数の現在の値に置き換えられます。 NODE_ENV変数が自動的に設定されることを忘れないでください。
ブラウザにアプリをロードして<input>を検査すると、その値がabcdefに設定されていることがわかります。VALDテキストは、 npm startを使用するときに提供される環境を表示します。
< div >
< small > You are running this application in < b > development </ b > mode. </ small >
< form >
< input type =" hidden " value =" abcdef " />
</ form >
</ div >上記のフォームは、環境からREACT_APP_SECRET_CODEと呼ばれる変数を探しています。この値を消費するには、環境で定義する必要があります。これは、シェルまたは.envファイルのいずれかの2つの方法を使用して実行できます。これらの両方の方法は、次のいくつかのセクションで説明されています。
NODE_ENVにアクセスできることは、条件付きでアクションを実行するのにも役立ちます。
if ( process . env . NODE_ENV !== 'production' ) {
analytics . disable ( ) ;
} npm run buildでアプリをコンパイルすると、模倣ステップがこの状態を取り除き、結果のバンドルが小さくなります。
注:この機能は、
[email protected]以上で利用できます。
また、 public/index.htmlのREACT_APP_から始まる環境変数にアクセスすることもできます。例えば:
< title > %REACT_APP_WEBSITE_NAME% </ title >上記のセクションの警告が適用されることに注意してください。
NODE_ENVおよびPUBLIC_URL )とは別に、変数名はREACT_APP_から始める必要があります。環境変数の定義は、OS間で異なる場合があります。また、この方法がシェルセッションの存続期間中であることを知ることも重要です。
set " REACT_APP_SECRET_CODE = abcdef " && npm start(注:移動式の課題に関する引用は、後続の空白を避けるために必要です。)
( $ env: REACT_APP_SECRET_CODE = " abcdef " ) -and (npm start)REACT_APP_SECRET_CODE=abcdef npm start.envに開発環境変数を追加します注:この機能は、
[email protected]以上で利用できます。
永続的な環境変数を定義するには、プロジェクトのルートに.envというファイルを作成します。
REACT_APP_SECRET_CODE=abcdef
注:
REACT_APP_から始まるカスタム環境変数を作成する必要があります。NODE_ENVを除く他の変数は、同じ名前を持つ可能性のあるマシン上の秘密鍵を誤って公開しないように無視されます。環境変数を変更するには、開発サーバーが実行されている場合は、開発サーバーを再起動する必要があります。
.env files should be checked into source control (with the exclusion of .env*.local ).
.env files can be used?Note: this feature is available with
[email protected]and higher .
.env : Default..env.local : Local overrides. This file is loaded for all environments except test..env.development , .env.test , .env.production : Environment-specific settings..env.development.local , .env.test.local , .env.production.local : Local overrides of environment-specific settings.Files on the left have more priority than files on the right:
npm start : .env.development.local , .env.development , .env.local , .envnpm run build : .env.production.local , .env.production , .env.local , .envnpm test : .env.test.local , .env.test , .env (note .env.local is missing) These variables will act as the defaults if the machine does not explicitly set them.
Please refer to the dotenv documentation for more details.
Note: If you are defining environment variables for development, your CI and/or hosting platform will most likely need these defined as well. Consult their documentation how to do this. For example, see the documentation for Travis CI or Heroku.
.envNote: this feature is available with
[email protected]and higher.
Expand variables already on your machine for use in your .env file (using dotenv-expand).
For example, to get the environment variable npm_package_version :
REACT_APP_VERSION=$npm_package_version
# also works:
# REACT_APP_VERSION=${npm_package_version}
Or expand variables local to the current .env file:
DOMAIN=www.example.com
REACT_APP_FOO=$DOMAIN/foo
REACT_APP_BAR=$DOMAIN/bar
Some popular libraries use decorators in their documentation.
Create React App intentionally doesn't support decorator syntax at the moment because:
However in many cases you can rewrite decorator-based code without decorators just as fine.
Please refer to these two threads for reference:
Create React App will add decorator support when the specification advances to a stable stage.
React doesn't prescribe a specific approach to data fetching, but people commonly use either a library like axios or the fetch() API provided by the browser.
The global fetch function allows you to easily make AJAX requests. It takes in a URL as an input and returns a Promise that resolves to a Response object. You can find more information about fetch here.
A Promise represents the eventual result of an asynchronous operation, you can find more information about Promises here and here. Both axios and fetch() use Promises under the hood. You can also use the async / await syntax to reduce the callback nesting.
Make sure the fetch() API and Promises are available in your target audience's browsers. For example, support in Internet Explorer requires a polyfill.
You can learn more about making AJAX requests from React components in the FAQ entry on the React website.
These tutorials will help you to integrate your app with an API backend running on another port, using fetch() to access it.
Check out this tutorial. You can find the companion GitHub repository here.
Check out this tutorial. You can find the companion GitHub repository here.
API Platform is a framework designed to build API-driven projects. It allows to create hypermedia and GraphQL APIs in minutes. It is shipped with an official Progressive Web App generator as well as a dynamic administration interface, both built for Create React App. Check out this tutorial.
Note: this feature is available with
[email protected]and higher.
People often serve the front-end React app from the same host and port as their backend implementation.
For example, a production setup might look like this after the app is deployed:
/ - static server returns index.html with React app
/todos - static server returns index.html with React app
/api/todos - server handles any /api/* requests using the backend implementation
Such setup is not required. However, if you do have a setup like this, it is convenient to write requests like fetch('/api/todos') without worrying about redirecting them to another host or port during development.
To tell the development server to proxy any unknown requests to your API server in development, add a proxy field to your package.json , for example:
"proxy" : "http://localhost:4000" , This way, when you fetch('/api/todos') in development, the development server will recognize that it's not a static asset, and will proxy your request to http://localhost:4000/api/todos as a fallback. The development server will only attempt to send requests without text/html in its Accept header to the proxy.
Conveniently, this avoids CORS issues and error messages like this in development:
Fetch API cannot load http://localhost:4000/api/todos. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
Keep in mind that proxy only has effect in development (with npm start ), and it is up to you to ensure that URLs like /api/todos point to the right thing in production. You don't have to use the /api prefix. Any unrecognized request without a text/html accept header will be redirected to the specified proxy .
The proxy option supports HTTP, HTTPS and WebSocket connections.
If the proxy option is not flexible enough for you, alternatively you can:
When you enable the proxy option, you opt into a more strict set of host checks. This is necessary because leaving the backend open to remote hosts makes your computer vulnerable to DNS rebinding attacks. The issue is explained in this article and this issue.
This shouldn't affect you when developing on localhost , but if you develop remotely like described here, you will see this error in the browser after enabling the proxy option:
Invalid Host header
To work around it, you can specify your public development host in a file called .env.development in the root of your project:
HOST=mypublicdevhost.com
If you restart the development server now and load the app from the specified host, it should work.
If you are still having issues or if you're using a more exotic environment like a cloud editor, you can bypass the host check completely by adding a line to .env.development.local . Note that this is dangerous and exposes your machine to remote code execution from malicious websites:
# NOTE: THIS IS DANGEROUS!
# It exposes your machine to attacks from the websites you visit.
DANGEROUSLY_DISABLE_HOST_CHECK=true
We don't recommend this approach.
Note: this feature is available with
[email protected]and higher.
If the proxy option is not flexible enough for you, you can get direct access to the Express app instance and hook up your own proxy middleware.
You can use this feature in conjunction with the proxy property in package.json , but it is recommended you consolidate all of your logic into src/setupProxy.js .
First, install http-proxy-middleware using npm or Yarn:
$ npm install http-proxy-middleware --save
$ # or
$ yarn add http-proxy-middleware Next, create src/setupProxy.js and place the following contents in it:
const proxy = require ( 'http-proxy-middleware' ) ;
module . exports = function ( app ) {
// ...
} ; You can now register proxies as you wish! Here's an example using the above http-proxy-middleware :
const proxy = require ( 'http-proxy-middleware' ) ;
module . exports = function ( app ) {
app . use ( proxy ( '/api' , { target : 'http://localhost:5000/' } ) ) ;
} ;Note: You do not need to import this file anywhere. It is automatically registered when you start the development server.
Note: This file only supports Node's JavaScript syntax. Be sure to only use supported language features (ie no support for Flow, ES Modules, etc).
Note: Passing the path to the proxy function allows you to use globbing and/or pattern matching on the path, which is more flexible than the express route matching.
Note: this feature is available with
[email protected]and higher.
You may require the dev server to serve pages over HTTPS. One particular case where this could be useful is when using the "proxy" feature to proxy requests to an API server when that API server is itself serving HTTPS.
To do this, set the HTTPS environment variable to true , then start the dev server as usual with npm start :
set HTTPS = true && npm start(Note: the lack of whitespace is intentional.)
( $ env: HTTPS = $true ) -and (npm start)HTTPS=true npm startNote that the server will use a self-signed certificate, so your web browser will almost definitely display a warning upon accessing the page.
<meta> Tags on the Server Since Create React App doesn't support server rendering, you might be wondering how to make <meta> tags dynamic and reflect the current URL. To solve this, we recommend to add placeholders into the HTML, like this:
<!doctype html >
< html lang =" en " >
< head >
< meta property =" og:title " content =" __OG_TITLE__ " >
< meta property =" og:description " content =" __OG_DESCRIPTION__ " > Then, on the server, regardless of the backend you use, you can read index.html into memory and replace __OG_TITLE__ , __OG_DESCRIPTION__ , and any other placeholders with values depending on the current URL. Just make sure to sanitize and escape the interpolated values so that they are safe to embed into HTML!
If you use a Node server, you can even share the route matching logic between the client and the server. However duplicating it also works fine in simple cases.
If you're hosting your build with a static hosting provider you can use react-snapshot or react-snap to generate HTML pages for each route, or relative link, in your application. These pages will then seamlessly become active, or “hydrated”, when the JavaScript bundle has loaded.
There are also opportunities to use this outside of static hosting, to take the pressure off the server when generating and caching routes.
The primary benefit of pre-rendering is that you get the core content of each page with the HTML payload—regardless of whether or not your JavaScript bundle successfully downloads. It also increases the likelihood that each route of your application will be picked up by search engines.
You can read more about zero-configuration pre-rendering (also called snapshotting) here.
Similarly to the previous section, you can leave some placeholders in the HTML that inject global variables, for example:
< ! doctype html >
< html lang = "en" >
< head >
< script >
window.SERVER_DATA = __SERVER_DATA__;
< / script > Then, on the server, you can replace __SERVER_DATA__ with a JSON of real data right before sending the response. The client code can then read window.SERVER_DATA to use it. Make sure to sanitize the JSON before sending it to the client as it makes your app vulnerable to XSS attacks.
Note: this feature is available with
[email protected]and higher.
Read the migration guide to learn how to enable it in older projects!
Create React App uses Jest as its test runner. To prepare for this integration, we did a major revamp of Jest so if you heard bad things about it years ago, give it another try.
Jest is a Node-based runner. This means that the tests always run in a Node environment and not in a real browser. This lets us enable fast iteration speed and prevent flakiness.
While Jest provides browser globals such as window thanks to jsdom, they are only approximations of the real browser behavior. Jest is intended to be used for unit tests of your logic and your components rather than the DOM quirks.
We recommend that you use a separate tool for browser end-to-end tests if you need them. They are beyond the scope of Create React App.
Jest will look for test files with any of the following popular naming conventions:
.js suffix in __tests__ folders..test.js suffix..spec.js suffix. The .test.js / .spec.js files (or the __tests__ folders) can be located at any depth under the src top level folder.
We recommend to put the test files (or __tests__ folders) next to the code they are testing so that relative imports appear shorter. For example, if App.test.js and App.js are in the same folder, the test just needs to import App from './App' instead of a long relative path. Colocation also helps find tests more quickly in larger projects.
When you run npm test , Jest will launch in the watch mode. Every time you save a file, it will re-run the tests, just like npm start recompiles the code.
The watcher includes an interactive command-line interface with the ability to run all tests, or focus on a search pattern. It is designed this way so that you can keep it open and enjoy fast re-runs. You can learn the commands from the “Watch Usage” note that the watcher prints after every run:
By default, when you run npm test , Jest will only run the tests related to files changed since the last commit. This is an optimization designed to make your tests run fast regardless of how many tests you have. However it assumes that you don't often commit the code that doesn't pass the tests.
Jest will always explicitly mention that it only ran tests related to the files changed since the last commit. You can also press a in the watch mode to force Jest to run all tests.
Jest will always run all tests on a continuous integration server or if the project is not inside a Git or Mercurial repository.
To create tests, add it() (or test() ) blocks with the name of the test and its code. You may optionally wrap them in describe() blocks for logical grouping but this is neither required nor recommended.
Jest provides a built-in expect() global function for making assertions. A basic test could look like this:
import sum from './sum' ;
it ( 'sums numbers' , ( ) => {
expect ( sum ( 1 , 2 ) ) . toEqual ( 3 ) ;
expect ( sum ( 2 , 2 ) ) . toEqual ( 4 ) ;
} ) ; All expect() matchers supported by Jest are extensively documented here.
You can also use jest.fn() and expect(fn).toBeCalled() to create “spies” or mock functions.
There is a broad spectrum of component testing techniques. They range from a “smoke test” verifying that a component renders without throwing, to shallow rendering and testing some of the output, to full rendering and testing component lifecycle and state changes.
Different projects choose different testing tradeoffs based on how often components change, and how much logic they contain. If you haven't decided on a testing strategy yet, we recommend that you start with creating simple smoke tests for your components:
import React from 'react' ;
import ReactDOM from 'react-dom' ;
import App from './App' ;
it ( 'renders without crashing' , ( ) => {
const div = document . createElement ( 'div' ) ;
ReactDOM . render ( < App / > , div ) ;
} ) ; This test mounts a component and makes sure that it didn't throw during rendering. Tests like this provide a lot of value with very little effort so they are great as a starting point, and this is the test you will find in src/App.test.js .
When you encounter bugs caused by changing components, you will gain a deeper insight into which parts of them are worth testing in your application. This might be a good time to introduce more specific tests asserting specific expected output or behavior.
If you'd like to test components in isolation from the child components they render, we recommend using shallow() rendering API from Enzyme. To install it, run:
npm install --save enzyme enzyme-adapter-react-16 react-test-renderer Alternatively you may use yarn :
yarn add enzyme enzyme-adapter-react-16 react-test-rendererAs of Enzyme 3, you will need to install Enzyme along with an Adapter corresponding to the version of React you are using. (The examples above use the adapter for React 16.)
The adapter will also need to be configured in your global setup file:
src/setupTests.js import { configure } from 'enzyme' ;
import Adapter from 'enzyme-adapter-react-16' ;
configure ( { adapter : new Adapter ( ) } ) ;Note: Keep in mind that if you decide to "eject" before creating
src/setupTests.js, the resultingpackage.jsonfile won't contain any reference to it. Read here to learn how to add this after ejecting.
Now you can write a smoke test with it:
import React from 'react' ;
import { shallow } from 'enzyme' ;
import App from './App' ;
it ( 'renders without crashing' , ( ) => {
shallow ( < App / > ) ;
} ) ; Unlike the previous smoke test using ReactDOM.render() , this test only renders <App> and doesn't go deeper. For example, even if <App> itself renders a <Button> that throws, this test will pass. Shallow rendering is great for isolated unit tests, but you may still want to create some full rendering tests to ensure the components integrate correctly. Enzyme supports full rendering with mount() , and you can also use it for testing state changes and component lifecycle.
You can read the Enzyme documentation for more testing techniques. Enzyme documentation uses Chai and Sinon for assertions but you don't have to use them because Jest provides built-in expect() and jest.fn() for spies.
Here is an example from Enzyme documentation that asserts specific output, rewritten to use Jest matchers:
import React from 'react' ;
import { shallow } from 'enzyme' ;
import App from './App' ;
it ( 'renders welcome message' , ( ) => {
const wrapper = shallow ( < App / > ) ;
const welcome = < h2 > Welcome to React < / h2 > ;
// expect(wrapper.contains(welcome)).toBe(true);
expect ( wrapper . contains ( welcome ) ) . toEqual ( true ) ;
} ) ; All Jest matchers are extensively documented here.
Nevertheless you can use a third-party assertion library like Chai if you want to, as described below.
Additionally, you might find jest-enzyme helpful to simplify your tests with readable matchers. The above contains code can be written more simply with jest-enzyme.
expect ( wrapper ) . toContainReact ( welcome ) ; To enable this, install jest-enzyme :
npm install --save jest-enzyme Alternatively you may use yarn :
yarn add jest-enzyme Import it in src/setupTests.js to make its matchers available in every test:
import 'jest-enzyme' ; We recommend that you use expect() for assertions and jest.fn() for spies. If you are having issues with them please file those against Jest, and we'll fix them. We intend to keep making them better for React, supporting, for example, pretty-printing React elements as JSX.
However, if you are used to other libraries, such as Chai and Sinon, or if you have existing code using them that you'd like to port over, you can import them normally like this:
import sinon from 'sinon' ;
import { expect } from 'chai' ;and then use them in your tests like you normally do.
Note: this feature is available with
[email protected]and higher.
If your app uses a browser API that you need to mock in your tests or if you just need a global setup before running your tests, add a src/setupTests.js to your project. It will be automatically executed before running your tests.
例えば:
src/setupTests.js const localStorageMock = {
getItem : jest . fn ( ) ,
setItem : jest . fn ( ) ,
clear : jest . fn ( ) ,
} ;
global . localStorage = localStorageMock ;Note: Keep in mind that if you decide to "eject" before creating
src/setupTests.js, the resultingpackage.jsonfile won't contain any reference to it, so you should manually create the propertysetupTestFrameworkScriptFilein the configuration for Jest, something like the following:
"jest" : { // ... "setupTestFrameworkScriptFile" : "<rootDir>/src/setupTests.js" }
You can replace it() with xit() to temporarily exclude a test from being executed.
Similarly, fit() lets you focus on a specific test without running any other tests.
Jest has an integrated coverage reporter that works well with ES6 and requires no configuration.
Run npm test -- --coverage (note extra -- in the middle) to include a coverage report like this:
Note that tests run much slower with coverage so it is recommended to run it separately from your normal workflow.
The default Jest coverage configuration can be overridden by adding any of the following supported keys to a Jest config in your package.json.
Supported overrides:
collectCoverageFromcoverageReporterscoverageThresholdsnapshotSerializersExample package.json:
{
"name" : " your-package " ,
"jest" : {
"collectCoverageFrom" : [
" src/**/*.{js,jsx} " ,
" !<rootDir>/node_modules/ " ,
" !<rootDir>/path/to/dir/ "
],
"coverageThreshold" : {
"global" : {
"branches" : 90 ,
"functions" : 90 ,
"lines" : 90 ,
"statements" : 90
}
},
"coverageReporters" : [ " text " ],
"snapshotSerializers" : [ " my-serializer-module " ]
}
}By default npm test runs the watcher with interactive CLI. However, you can force it to run tests once and finish the process by setting an environment variable called CI .
When creating a build of your application with npm run build linter warnings are not checked by default. Like npm test , you can force the build to perform a linter warning check by setting the environment variable CI . If any warnings are encountered then the build fails.
Popular CI servers already set the environment variable CI by default but you can do this yourself too:
.travis.yml file to your git repository. language: node_js
node_js:
- 8
cache:
directories:
- node_modules
script:
- npm run build
- npm test
Follow this article to set up CircleCI with a Create React App project.
set CI = true && npm test set CI = true && npm run build(Note: the lack of whitespace is intentional.)
( $ env: CI = $true ) -and (npm test)( $ env: CI = $true ) -and (npm run build)CI=true npm test CI=true npm run buildThe test command will force Jest to run tests once instead of launching the watcher.
If you find yourself doing this often in development, please file an issue to tell us about your use case because we want to make watcher the best experience and are open to changing how it works to accommodate more workflows.
The build command will check for linter warnings and fail if any are found.
If you know that none of your tests depend on jsdom, you can safely set --env=node , and your tests will run faster:
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
- "test": "react-scripts test"
+ "test": "react-scripts test --env=node"To help you make up your mind, here is a list of APIs that need jsdom :
window and documentReactDOM.render()TestUtils.renderIntoDocument() (a shortcut for the above)mount() in EnzymeIn contrast, jsdom is not needed for the following APIs:
TestUtils.createRenderer() (shallow rendering)shallow() in EnzymeFinally, jsdom is also not needed for snapshot testing.
Snapshot testing is a feature of Jest that automatically generates text snapshots of your components and saves them on the disk so if the UI output changes, you get notified without manually writing any assertions on the component output. Read more about snapshot testing.
If you use Visual Studio Code, there is a Jest extension which works with Create React App out of the box. This provides a lot of IDE-like features while using a text editor: showing the status of a test run with potential fail messages inline, starting and stopping the watcher automatically, and offering one-click snapshot updates.
There are various ways to setup a debugger for your Jest tests. We cover debugging in Chrome and Visual Studio Code.
Note: debugging tests requires Node 8 or higher.
Add the following to the scripts section in your project's package.json
"scripts" : {
"test:debug" : " react-scripts --inspect-brk test --runInBand "
} Place debugger; statements in any test and run:
$ npm run test:debugThis will start running your Jest tests, but pause before executing to allow a debugger to attach to the process.
Open the following in Chrome
about:inspect
After opening that link, the Chrome Developer Tools will be displayed. Select inspect on your process and a breakpoint will be set at the first line of the react script (this is done simply to give you time to open the developer tools and to prevent Jest from executing before you have time to do so). Click the button that looks like a "play" button in the upper right hand side of the screen to continue execution. When Jest executes the test that contains the debugger statement, execution will pause and you can examine the current scope and call stack.
Note: the --runInBand cli option makes sure Jest runs test in the same process rather than spawning processes for individual tests. Normally Jest parallelizes test runs across processes but it is hard to debug many processes at the same time.
Debugging Jest tests is supported out of the box for Visual Studio Code.
Use the following launch.json configuration file:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": [
"test",
"--runInBand",
"--no-cache"
],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Usually, in an app, you have a lot of UI components, and each of them has many different states. For an example, a simple button component could have following states:
Usually, it's hard to see these states without running a sample app or some examples.
Create React App doesn't include any tools for this by default, but you can easily add Storybook for React (source) or React Styleguidist (source) to your project. These are third-party tools that let you develop components and see all their states in isolation from your app .
You can also deploy your Storybook or style guide as a static app. This way, everyone in your team can view and review different states of UI components without starting a backend server or creating an account in your app.
Storybook is a development environment for React UI components. It allows you to browse a component library, view the different states of each component, and interactively develop and test components.
First, install the following npm package globally:
npm install -g @storybook/cliThen, run the following command inside your app's directory:
getstorybookAfter that, follow the instructions on the screen.
Learn more about React Storybook:
Styleguidist combines a style guide, where all your components are presented on a single page with their props documentation and usage examples, with an environment for developing components in isolation, similar to Storybook. In Styleguidist you write examples in Markdown, where each code snippet is rendered as a live editable playground.
First, install Styleguidist:
npm install --save react-styleguidist Alternatively you may use yarn :
yarn add react-styleguidist Then, add these scripts to your package.json :
"scripts": {
+ "styleguide": "styleguidist server",
+ "styleguide:build": "styleguidist build",
"start": "react-scripts start",Then, run the following command inside your app's directory:
npm run styleguideAfter that, follow the instructions on the screen.
Learn more about React Styleguidist:
Create React App doesn't provide any built-in functionality to publish a component to npm. If you're ready to extract a component from your project so other people can use it, we recommend moving it to a separate directory outside of your project and then using a tool like nwb to prepare it for publishing.
The production build has all the tools necessary to generate a first-class Progressive Web App, but the offline/cache-first behavior is opt-in only . By default, the build process will generate a service worker file, but it will not be registered, so it will not take control of your production web app.
In order to opt-in to the offline-first behavior, developers should look for the following in their src/index.js file:
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: http://bit.ly/CRA-PWA
serviceWorker . unregister ( ) ; As the comment states, switching serviceWorker.unregister() to serviceWorker.register() will opt you in to using the service worker.
Offline-first Progressive Web Apps are faster and more reliable than traditional web pages, and provide an engaging mobile experience:
However, they can make debugging deployments more challenging so, starting with Create React App 2, service workers are opt-in.
The workbox-webpack-plugin is integrated into production configuration, and it will take care of generating a service worker file that will automatically precache all of your local assets and keep them up to date as you deploy updates. The service worker will use a cache-first strategy for handling all requests for local assets, including navigation requests for your HTML, ensuring that your web app is consistently fast, even on a slow or unreliable network.
If you do decide to opt-in to service worker registration, please take the following into account:
Service workers require HTTPS, although to facilitate local testing, that policy does not apply to localhost . If your production web server does not support HTTPS, then the service worker registration will fail, but the rest of your web app will remain functional.
Service workers are not supported in older web browsers. Service worker registration won't be attempted on browsers that lack support.
The service worker is only enabled in the production environment, eg the output of npm run build . It's recommended that you do not enable an offline-first service worker in a development environment, as it can lead to frustration when previously cached assets are used and do not include the latest changes you've made locally.
If you need to test your offline-first service worker locally, build the application (using npm run build ) and run a simple http server from your build directory. After running the build script, create-react-app will give instructions for one way to test your production build locally and the deployment instructions have instructions for using other methods. Be sure to always use an incognito window to avoid complications with your browser cache.
Users aren't always familiar with offline-first web apps. It can be useful to let the user know when the service worker has finished populating your caches (showing a "This web app works offline!" message) and also let them know when the service worker has fetched the latest updates that will be available the next time they load the page (showing a "New content is available; please refresh." message). Showing this messages is currently left as an exercise to the developer, but as a starting point, you can make use of the logic included in src/registerServiceWorker.js , which demonstrates which service worker lifecycle events to listen for to detect each scenario, and which as a default, just logs appropriate messages to the JavaScript console.
By default, the generated service worker file will not intercept or cache any cross-origin traffic, like HTTP API requests, images, or embeds loaded from a different domain.
The default configuration includes a web app manifest located at public/manifest.json , that you can customize with details specific to your web application.
When a user adds a web app to their homescreen using Chrome or Firefox on Android, the metadata in manifest.json determines what icons, names, and branding colors to use when the web app is displayed. The Web App Manifest guide provides more context about what each field means, and how your customizations will affect your users' experience.
Progressive web apps that have been added to the homescreen will load faster and work offline when there's an active service worker. That being said, the metadata from the web app manifest will still be used regardless of whether or not you opt-in to service worker registration.
Source map explorer analyzes JavaScript bundles using the source maps. This helps you understand where code bloat is coming from.
To add Source map explorer to a Create React App project, follow these steps:
npm install --save source-map-explorer Alternatively you may use yarn :
yarn add source-map-explorer Then in package.json , add the following line to scripts :
"scripts": {
+ "analyze": "source-map-explorer build/static/js/main.*",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",Then to analyze the bundle run the production build then run the analyze script.
npm run build
npm run analyze
npm run build creates a build directory with a production build of your app. Set up your favorite HTTP server so that a visitor to your site is served index.html , and requests to static paths like /static/js/main.<hash>.js are served with the contents of the /static/js/main.<hash>.js file.
For environments using Node, the easiest way to handle this would be to install serve and let it handle the rest:
npm install -g serve
serve -s build The last command shown above will serve your static site on the port 5000 . Like many of serve's internal settings, the port can be adjusted using the -p or --port flags.
Run this command to get a full list of the options available:
serve -hYou don't necessarily need a static server in order to run a Create React App project in production. It works just as fine integrated into an existing dynamic one.
Here's a programmatic example using Node and Express:
const express = require ( 'express' ) ;
const path = require ( 'path' ) ;
const app = express ( ) ;
app . use ( express . static ( path . join ( __dirname , 'build' ) ) ) ;
app . get ( '/' , function ( req , res ) {
res . sendFile ( path . join ( __dirname , 'build' , 'index.html' ) ) ;
} ) ;
app . listen ( 9000 ) ;The choice of your server software isn't important either. Since Create React App is completely platform-agnostic, there's no need to explicitly use Node.
The build folder with static assets is the only output produced by Create React App.
However this is not quite enough if you use client-side routing. Read the next section if you want to support URLs like /todos/42 in your single-page app.
If you use routers that use the HTML5 pushState history API under the hood (for example, React Router with browserHistory ), many static file servers will fail. For example, if you used React Router with a route for /todos/42 , the development server will respond to localhost:3000/todos/42 properly, but an Express serving a production build as above will not.
This is because when there is a fresh page load for a /todos/42 , the server looks for the file build/todos/42 and does not find it. The server needs to be configured to respond to a request to /todos/42 by serving index.html . For example, we can amend our Express example above to serve index.html for any unknown paths:
app.use(express.static(path.join(__dirname, 'build')));
- app.get('/', function (req, res) {
+ app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
}); If you're using Apache HTTP Server, you need to create a .htaccess file in the public folder that looks like this:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]
It will get copied to the build folder when you run npm run build .
If you're using Apache Tomcat, you need to follow this Stack Overflow answer.
Now requests to /todos/42 will be handled correctly both in development and in production.
On a production build, and when you've opted-in, a service worker will automatically handle all navigation requests, like for /todos/42 , by serving the cached copy of your index.html . This service worker navigation routing can be configured or disabled by eject ing and then modifying the navigateFallback and navigateFallbackWhitelist options of the SWPreachePlugin configuration.
When users install your app to the homescreen of their device the default configuration will make a shortcut to /index.html . This may not work for client-side routers which expect the app to be served from / . Edit the web app manifest at public/manifest.json and change start_url to match the required URL scheme, for example:
"start_url" : "." , By default, Create React App produces a build assuming your app is hosted at the server root.
To override this, specify the homepage in your package.json , for example:
"homepage" : "http://mywebsite.com/relativepath" ,This will let Create React App correctly infer the root path to use in the generated HTML file.
Note : If you are using react-router@^4 , you can root <Link> s using the basename prop on any <Router> .
More information here.
例えば:
< BrowserRouter basename = "/calendar" / >
< Link to = "/today" / > // renders <a href="/calendar/today"> Note: this feature is available with
[email protected]and higher.
If you are not using the HTML5 pushState history API or not using client-side routing at all, it is unnecessary to specify the URL from which your app will be served. Instead, you can put this in your package.json :
"homepage" : "." , This will make sure that all the asset paths are relative to index.html . You will then be able to move your app from http://mywebsite.com to http://mywebsite.com/relativepath or even http://mywebsite.com/relative/path without having to rebuild it.
You can create an arbitrary build environment by creating a custom .env file and loading it using env-cmd.
For example, to create a build environment for a staging environment:
.env.staging.env file (eg REACT_APP_API_URL=http://api-staging.example.com )$ npm install env-cmd --save
$ # or
$ yarn add env-cmdpackage.json , building with your new environment: {
"scripts" : {
"build:staging" : " env-cmd .env.staging npm run build "
}
} Now you can run npm run build:staging to build with the staging environment config. You can specify other environments in the same way.
Variables in .env.production will be used as fallback because NODE_ENV will always be set to production for a build.
See this blog post on how to deploy your React app to Microsoft Azure.
See this blog post or this repo for a way to use automatic deployment to Azure App Service.
Install the Firebase CLI if you haven't already by running npm install -g firebase-tools . Sign up for a Firebase account and create a new project. Run firebase login and login with your previous created Firebase account.
Then run the firebase init command from your project's root. You need to choose the Hosting: Configure and deploy Firebase Hosting sites and choose the Firebase project you created in the previous step. You will need to agree with database.rules.json being created, choose build as the public directory, and also agree to Configure as a single-page app by replying with y .
=== Project Setup
First, let ' s associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we ' ll just set up a default project.
? What Firebase project do you want to associate as default ? Example app (example-app-fd690)
=== Database Setup
Firebase Realtime Database Rules allow you to define how your data should be
structured and when your data can be read from and written to.
? What file should be used for Database Rules ? database.rules.json
✔ Database Rules for example-app-fd690 have been downloaded to database.rules.json.
Future modifications to database.rules.json will update Database Rules when you run
firebase deploy.
=== Hosting Setup
Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to uploaded with firebase deploy. If you
have a build process for your assets, use your build ' s output directory.
? What do you want to use as your public directory? build
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
✔ Wrote build/index.html
i Writing configuration info to firebase.json...
i Writing project information to .firebaserc...
✔ Firebase initialization complete! IMPORTANT: you need to set proper HTTP caching headers for service-worker.js file in firebase.json file or you will not be able to see changes after first deployment (issue #2440). It should be added inside "hosting" key like next:
{
"hosting": {
...
"headers": [
{"source": "/service-worker.js", "headers": [{"key": "Cache-Control", "value": "no-cache"}]}
]
...
Now, after you create a production build with npm run build , you can deploy it by running firebase deploy .
=== Deploying to ' example-app-fd690 ' ...
i deploying database, hosting
✔ database: rules ready to deploy.
i hosting: preparing build directory for upload...
Uploading: [ ============================== ] 75%✔ hosting: build folder uploaded successfully
✔ hosting: 8 files uploaded successfully
i starting release process (may take several minutes)...
✔ Deploy complete !
Project Console: https://console.firebase.google.com/project/example-app-fd690/overview
Hosting URL: https://example-app-fd690.firebaseapp.comFor more information see Add Firebase to your JavaScript Project.
Note: this feature is available with
[email protected]and higher.
homepage to package.json The step below is important!
If you skip it, your app will not deploy correctly.
Open your package.json and add a homepage field for your project:
"homepage" : " https://myusername.github.io/my-app " ,or for a GitHub user page:
"homepage" : " https://myusername.github.io " ,or for a custom domain page:
"homepage" : " https://mywebsite.com " , Create React App uses the homepage field to determine the root URL in the built HTML file.
gh-pages and add deploy to scripts in package.json Now, whenever you run npm run build , you will see a cheat sheet with instructions on how to deploy to GitHub Pages.
To publish it at https://myusername.github.io/my-app, run:
npm install --save gh-pages Alternatively you may use yarn :
yarn add gh-pages Add the following scripts in your package.json :
"scripts": {
+ "predeploy": "npm run build",
+ "deploy": "gh-pages -d build",
"start": "react-scripts start",
"build": "react-scripts build", The predeploy script will run automatically before deploy is run.
If you are deploying to a GitHub user page instead of a project page you'll need to make two additional modifications:
package.json scripts to push deployments to master : "scripts": {
"predeploy": "npm run build",
- "deploy": "gh-pages -d build",
+ "deploy": "gh-pages -b master -d build", npm run deployその後、実行:
npm run deploygh-pages Finally, make sure GitHub Pages option in your GitHub project settings is set to use the gh-pages branch:
You can configure a custom domain with GitHub Pages by adding a CNAME file to the public/ folder.
Your CNAME file should look like this:
mywebsite.com
GitHub Pages doesn't support routers that use the HTML5 pushState history API under the hood (for example, React Router using browserHistory ). This is because when there is a fresh page load for a url like http://user.github.io/todomvc/todos/42 , where /todos/42 is a frontend route, the GitHub Pages server returns 404 because it knows nothing of /todos/42 . If you want to add a router to a project hosted on GitHub Pages, here are a couple of solutions:
hashHistory for this effect, but the URL will be longer and more verbose (for example, http://user.github.io/todomvc/#/todos/42?_k=yknaj ) 。 Read more about different history implementations in React Router.index.html page with a special redirect parameter. You would need to add a 404.html file with the redirection code to the build folder before deploying your project, and you'll need to add code handling the redirect parameter to index.html . You can find a detailed explanation of this technique in this guide. If, when deploying, you get /dev/tty: No such a device or address or a similar error, try the following:
git remote set-url origin https://<user>:<token>@github.com/<user>/<repo> .npm run deploy again If, when deploying, you get Cannot read property 'email' of null , try the following:
git config --global user.name '<your_name>'git config --global user.email '<your_email>'npm run deploy again Use the Heroku Buildpack for Create React App.
You can find instructions in Deploying React with Zero Configuration.
Sometimes npm run build works locally but fails during deploy via Heroku. Following are the most common cases.
If you get something like this:
remote: Failed to create a production build. Reason:
remote: Module not found: Error: Cannot resolve 'file' or 'directory'
MyDirectory in /tmp/build_1234/src
It means you need to ensure that the lettercase of the file or directory you import matches the one you see on your filesystem or on GitHub.
This is important because Linux (the operating system used by Heroku) is case sensitive. So MyDirectory and mydirectory are two distinct directories and thus, even though the project builds locally, the difference in case breaks the import statements on Heroku remotes.
If you exclude or ignore necessary files from the package you will see a error similar this one:
remote: Could not find a required file.
remote: Name: `index.html`
remote: Searched in: /tmp/build_a2875fc163b209225122d68916f1d4df/public
remote:
remote: npm ERR! Linux 3.13.0-105-generic
remote: npm ERR! argv "/tmp/build_a2875fc163b209225122d68916f1d4df/.heroku/node/bin/node" "/tmp/build_a2875fc163b209225122d68916f1d4df/.heroku/node/bin/npm" "run" "build"
In this case, ensure that the file is there with the proper lettercase and that's not ignored on your local .gitignore or ~/.gitignore_global .
To do a manual deploy to Netlify's CDN:
npm install netlify-cli -g
netlify deploy Choose build as the path to deploy.
To setup continuous delivery:
With this setup Netlify will build and deploy when you push to git or open a pull request:
Build your siteSupport for client-side routing:
To support pushState , make sure to create a public/_redirects file with the following rewrite rules:
/* /index.html 200
When you build the project, Create React App will place the public folder contents into the build output.
Now offers a zero-configuration single-command deployment. You can use now to deploy your app for free.
Install the now command-line tool either via the recommended desktop tool or via node with npm install -g now .
Build your app by running npm run build .
Move into the build directory by running cd build .
Run now --name your-project-name from within the build directory. You will see a now.sh URL in your output like this:
> Ready! https://your-project-name-tpspyhtdtk.now.sh (copied to clipboard)
Paste that URL into your browser when the build is complete, and you will see your deployed app.
Details are available in this article.
See this blog post on how to deploy your React app to Amazon Web Services S3 and CloudFront.
Install the Surge CLI if you haven't already by running npm install -g surge . Run the surge command and log in you or create a new account.
When asked about the project path, make sure to specify the build folder, for example:
project path: /path/to/project/build Note that in order to support routers that use HTML5 pushState API, you may want to rename the index.html in your build folder to 200.html before deploying to Surge. This ensures that every URL falls back to that file.
You can adjust various development and production settings by setting environment variables in your shell or with .env.
| 変数 | 発達 | 生産 | 使用法 |
|---|---|---|---|
| ブラウザ | ✅ | By default, Create React App will open the default system browser, favoring Chrome on macOS. Specify a browser to override this behavior, or set it to none to disable it completely. If you need to customize the way the browser is launched, you can specify a node script instead. Any arguments passed to npm start will also be passed to this script, and the url where your app is served will be the last argument. Your script's file name must have the .js extension. | |
| ホスト | ✅ | By default, the development web server binds to localhost . You may use this variable to specify a different host. | |
| ポート | ✅ | By default, the development web server will attempt to listen on port 3000 or prompt you to attempt the next available port. You may use this variable to specify a different port. | |
| HTTPS | ✅ | When set to true , Create React App will run the development server in https mode. | |
| PUBLIC_URL | ✅ | Create React App assumes your application is hosted at the serving web server's root or a subpath as specified in package.json ( homepage ). Normally, Create React App ignores the hostname. You may use this variable to force assets to be referenced verbatim to the url you provide (hostname included). This may be particularly useful when using a CDN to host your application. | |
| CI | ? | ✅ | When set to true , Create React App treats warnings as failures in the build. It also makes the test runner non-watching. Most CIs set this flag by default. |
| REACT_EDITOR | ✅ | When an app crashes in development, you will see an error overlay with clickable stack trace. When you click on it, Create React App will try to determine the editor you are using based on currently running processes, and open the relevant source file. You can send a pull request to detect your editor of choice. Setting this environment variable overrides the automatic detection. If you do it, make sure your systems PATH environment variable points to your editor's bin folder. You can also set it to none to disable it completely. | |
| CHOKIDAR_USEPOLLING | ✅ | When set to true , the watcher runs in polling mode, as necessary inside a VM. Use this option if npm start isn't detecting changes. | |
| GENERATE_SOURCEMAP | ✅ | When set to false , source maps are not generated for a production build. This solves OOM issues on some smaller machines. | |
| NODE_PATH | ✅ | ✅ | Same as NODE_PATH in Node.js, but only relative folders are allowed. Can be handy for emulating a monorepo setup by setting NODE_PATH=src . |
npm start doesn't detect changes When you save a file while npm start is running, the browser should refresh with the updated code.
If this doesn't happen, try one of the following workarounds:
index.js and you're referencing it by the folder name, you need to restart the watcher due to a Webpack bug..env file in your project directory if it doesn't exist, and add CHOKIDAR_USEPOLLING=true to it. This ensures that the next time you run npm start , the watcher uses the polling mode, as necessary inside a VM.If none of these solutions help please leave a comment in this thread.
npm test hangs or crashes on macOS Sierra If you run npm test and the console gets stuck after printing react-scripts test to the console there might be a problem with your Watchman installation as described in facebook/create-react-app#713.
We recommend deleting node_modules in your project and running npm install (or yarn if you use it) first. If it doesn't help, you can try one of the numerous workarounds mentioned in these issues:
It is reported that installing Watchman 4.7.0 or newer fixes the issue. If you use Homebrew, you can run these commands to update it:
watchman shutdown-server
brew update
brew reinstall watchman
You can find other installation methods on the Watchman documentation page.
If this still doesn't help, try running launchctl unload -F ~/Library/LaunchAgents/com.github.facebook.watchman.plist .
There are also reports that uninstalling Watchman fixes the issue. So if nothing else helps, remove it from your system and try again.
npm run build exits too early It is reported that npm run build can fail on machines with limited memory and no swap space, which is common in cloud environments. Even with small projects this command can increase RAM usage in your system by hundreds of megabytes, so if you have less than 1 GB of available memory your build is likely to fail with the following message:
The build failed because the process exited too early. This probably means the system ran out of memory or someone called
kill -9on the process.
If you are completely sure that you didn't terminate the process, consider adding some swap space to the machine you're building on, or build the project locally.
npm run build fails on HerokuThis may be a problem with case sensitive filenames. Please refer to this section.
If you use a Moment.js, you might notice that only the English locale is available by default. This is because the locale files are large, and you probably only need a subset of all the locales provided by Moment.js.
To add a specific Moment.js locale to your bundle, you need to import it explicitly.
例えば:
import moment from 'moment' ;
import 'moment/locale/fr' ; If you are importing multiple locales this way, you can later switch between them by calling moment.locale() with the locale name:
import moment from 'moment' ;
import 'moment/locale/fr' ;
import 'moment/locale/es' ;
// ...
moment . locale ( 'fr' ) ;This will only work for locales that have been explicitly imported before.
npm run build fails to minify Before [email protected] , this problem was caused by third party node_modules using modern JavaScript features because the minifier couldn't handle them during the build. This has been solved by compiling standard modern JavaScript features inside node_modules in [email protected] and higher.
If you're seeing this error, you're likely using an old version of react-scripts . You can either fix it by avoiding a dependency that uses modern syntax, or by upgrading to react-scripts@>=2.0.0 and following the migration instructions in the changelog.
Ejecting lets you customize anything, but from that point on you have to maintain the configuration and scripts yourself. This can be daunting if you have many similar projects. In such cases instead of ejecting we recommend to fork react-scripts and any other packages you need. This article dives into how to do it in depth. You can find more discussion in this issue.
If you have ideas for more “How To” recipes that should be on this page, let us know or contribute some!