pug導入前環境
Webpack + Express + React + Typescript
pug導入の理由
導入前はExpressでSSRをし,クライアントからのリクエストに対しres.send(html)で単純にhtmlスクリプトを送信するだけだった.これではデータベースから取得した値をクライアント側に渡すことができない.そのため,テンプレートエンジンであるpug(or ejs)を導入したかった.
やりたいこと
単純にルートにアクセスされた時にhtmlテンプレートに値を渡してレンダリングしたい.今回やりたいこととしては,レンダリングさえしてくれれば良いので,htmlとしてdistに出力されなくて良い(これをしようとするとWebpackでHtmlWebpackPluginが必要)
import express from 'express'; const postController = require('./controllers/postController'); const app = express(); app.get('/', postController.doGetPostForSsr); //静的ファイル app.use(express.static('dist')) app.listen(process.env.PORT || 3000, function () { console.log('express app is started.'); });
import express from 'express'; const Posts = require('../models/Posts'); const ssrController = require('./ssrController'); module.exports = { doGetPostForSsr: (req: express.Request, res: express.Response) => { Posts.getPost().then((result) => { const elements = ssrController.ssr(result); res.render("html", elements); }).catch((err) => {console.log(err);}) } }
エラー地獄
ただテンプレートエンジン導入するのに1日かかりました....webpack嫌いになりそうでしたけど,自分の力のなさですね,勉強になりました.
どこでどーゆーエラーが出たってのもストーリー立てて説明すると途方もないので,結論の導入方法だけ記述します.
pug導入
pug導入にはExpress側とWebpack側それぞれに設定が必要でした.
Express側pug導入
import express from 'express'; const postController = require('./controllers/postController'); const app = express(); app.engine('pug', require('pug').__express); //追加 app.set('view engine', 'pug'); //追加 app.get('/', postController.doGetPostForSsr); //静的ファイル app.use(express.static('dist')) app.listen(process.env.PORT || 3000, function () { console.log('express app is started.'); });
これでExpressがpugを認識できるようになり,読み込んでくれるviewsディレクトリがルート直下に設定される?ぽいです.
Webpack側pug導入
npm install webpack-node-externals --save-dev
const nodeExternals = require('webpack-node-externals'); module.exports = { ... externals: [nodeExternals()], ... }
これがないとよくわかりませんが,buildは問題なく通りますがアクセス時にCannot find module "../lib/utils.js"ってエラーが出るんですよね.これは【webpack】Cannot find module "../lib/utils.js"を参考にしました.
おわりに
今回の目的はpugコンパイルからのhtmlの出力ではなく,単なるレンダリングでしたので,pug-loaderは使いませんでしたが,いろいろいじっていたところ,htmlの出力をする場合はhtml-webpack-plugin, pug, pug-loader使ってwebpackで設定したらできました.これは調べたらすぐ出てくるのでここに書く必要はないかと.
HTMLもわからない状態から独学を初めて1年と2ヶ月程経つのかな?最初は全てフルスクラッチで記述していたので,最近やっとフレームワークの恩恵とMVCモデルの素晴らしさを理解することができてきました.(最初はサーバーサイドでjs動くってのが衝撃的だったの覚えてますね笑)これからはちょっとはインフラの方も理解できたらなと思います〜.