create-react-appのアプリをExpress内で配置、配信する
クライアントReactアプリとWebサーバー&APIサーバーを分けるのが面倒で一箇所(プロセス)でホスティングしたいときがあります
create-react-app で作成したプロジェクトをexpressの /_admin 以下で動作(配信)させてみます
Express環境
$ express together create : together create : together/package.json create : together/app.js create : together/public create : together/routes create : together/routes/index.js create : together/routes/users.js create : together/views create : together/views/index.jade create : together/views/layout.jade create : together/views/error.jade create : together/bin create : together/bin/www create : together/public/javascripts create : together/public/images create : together/public/stylesheets create : together/public/stylesheets/style.css install dependencies: $ cd together && npm install run the app: $ DEBUG=together:* npm start $ cd together/ $ npm install
create-react-appをexpressプロジェクト内で作成
$ cd together $ create-react-app client create-react-app client Creating a new React app in ~/together/client. Installing packages. This might take a couple of minutes. Installing react, react-dom, and react-scripts...
ディレクトリ構造は
together
├── app.js
├── bin
├── client <-- ここにcreate-react-app
├── node_modules
├── package-lock.json
├── package.json
├── public
├── routes
└── views
express の app.js
app.js
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var index = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); // 静的ファイルの配信をURL毎に設定 //---------------------------------------------- app.use('/_admin',express.static(path.join(__dirname, 'client/build'))); // publicのstatic app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index); app.use('/users', users); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
clientのreactアプリを express上の /_admin
で動作させたいので
app.use('/_admin',express.static(path.join(__dirname, 'client/build')));
create-react-app の package.json
client/package.json
{ "name": "client", "version": "0.1.0", "private": true, "homepage": "/_admin", // <--- ここにBase URLを設定 "dependencies": { "react": "^16.1.1", "react-dom": "^16.1.1", "react-scripts": "1.0.17" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } }
create-react-appをbuild
$ cd ~/together/client
$ npm run build
express サーバー起動
$ cd ~/together $ npm start
ブラウザで確認
localhost:3000
expressのデフォルトページ(route / )が表示されます
localhost:3000/users
expressのroute /users が表示されます
localhost:3000/_admin
create-react-app のおなじみのデフォルトページが表示されます。
以上です