これは私が正確に理解するのは困難でした。グーグルによるガイダンスの邪魔になることはほとんどありません。これが他の人の役に立つことを願っています。
Dan Cornilescuが指摘したように、ハンドラーは最初の一致を受け入れます。したがって、より具体的なものからそれほど具体的でないものへと進みます。 npm run build
によって作成されたフォルダ構造に従うことで、これを解決しました。1. js、css、およびmediaのサブディレクトリを処理します。 2. manifest.jsonおよびfav.icoに対するjsonおよびicoリクエストを処理します。 3.他のすべてのトラフィックをindex.htmlにルーティングします。
handlers:
- url: /static/js/(.*)
static_files: build/static/js/\1
upload: build/static/js/(.*)
- url: /static/css/(.*)
static_files: build/static/css/\1
upload: build/static/css/(.*)
- url: /static/media/(.*)
static_files: build/static/media/\1
upload: build/static/media/(.*)
- url: /(.*\.(json|ico))$
static_files: build/\1
upload: build/.*\.(json|ico)$
- url: /
static_files: build/index.html
upload: build/index.html
- url: /.*
static_files: build/index.html
upload: build/index.html
より効率的な回答を歓迎します。
元の質問:
反応ルータールートのGAE app.yamlを設定すると、「予期しないトークン<」エラーが発生します。
開発環境では、すべてのルートは直接呼び出されたときに機能します。 localhost:5000およびlocalhost:5000/testは、期待される結果を生成します。
GAEでは、URL www.test-app.comが直接呼び出されたときのルートディレクトリのapp.yaml関数。 www.test-app.com/testは404エラーを生成します。
app.yaml #1
runtime: nodejs8
instance_class: F1
automatic_scaling:
max_instances: 1
handlers:
- url: /
static_files: build/index.html
upload: build/index.html
ワイルドカードルートを受け入れるようにapp.yamlを構成すると、すべてのパスで失敗します。 www.test-app.com/およびwww.test-app.com/testは、「予期しないトークン<」というエラーを生成します。 .jsファイルをindex.htmlとして提供しているようです。
app.yaml #2
runtime: nodejs8
instance_class: F1
automatic_scaling:
max_instances: 1
handlers:
- url: /.*
static_files: build/index.html
upload: build/index.html
ノード:10.15.0 npm:6.4.1
gcloud init
Google Cloud SDK経由
npm init react-app test-app
npm install react-router-dom
ルーターをindex.jsに追加します。
index.js
import {BrowserRouter as Router, Route} from 'react-router-dom';
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<Router>
<App />
</Router>,
document.getElementById('root'));
serviceWorker.unregister();
App.jsにルーティングを追加します。
app.js
import {Route} from 'react-router-dom'
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
render() {
return (
<div>
<Route exact path="/"
render={() => <div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>} />
<Route exact path="/test"
render={() => <div className="App">
Hello, World!
</div>} />
</div>
);
}
}
export default App;
Package.jsonへの変更はありません:
package.json
{
"name": "test-app",
"version": "0.1.0",
"private": true,
"dependencies": {
"react": "^16.7.0",
"react-dom": "^16.7.0",
"react-router-dom": "^4.3.1",
"react-scripts": "2.1.3"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": [
">0.2%",
"not dead",
"not ie <= 11",
"not op_mini all"
]
}
npm run build
gcloud app deploy
Google App Engine、webpack、app.yamlを1日間楽しんだ後、次の設定が私に役立ちました。
webpack.js(関連するjsonパーツのみ、つまりモジュールのルール):
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'media/',
limit: 8192
}
}
]
},
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/'
}
}
]
},
app.yaml
runtime: nodejs10
handlers:
- url: /(.*\.(png|ico|jpg|gif))$
static_files: dist/\1
upload: dist/.*\.(png|ico|jpg|gif)$
- url: /fonts/(.*\.(woff|woff2))$
static_files: dist/fonts/\1
upload: dist/fonts/.*\.(woff|woff2)$
- url: /html.js
static_files: dist/html.js
upload: dist/html.js
- url: /javascript.js
static_files: dist/javascript.js
upload: dist/javascript.js
- url: /.*
static_files: dist/index.html
upload: dist/index.html
secure: always
redirect_http_response_code: 301
- url: /
static_dir: dist
注:私の出力ディレクトリはdistなので、ビルドするように変更してください
私はこれに少し時間を費やしましたが、これは私のReact GAE標準のCRAに対しては完全に機能します。
runtime: nodejs10
service: bbi-staging
env: standard
instance_class: F2
handlers:
- url: /(.*\.(gif|media|json|ico|eot|ttf|woff|woff2|png|jpg|css|js))$
static_files: build/\1
upload: build/(.*)
- url: /(.*)
static_files: build/index.html
upload: build/index.html