├── .gitignore ├── next-env.d.ts ├── package-lock.json ├── package.json ├── server └── index.ts ├── src └── pages │ ├── _error.tsx │ └── index.tsx ├── tsconfig.json └── tsconfig.server.json /.gitignore: -------------------------------------------------------------------------------- 1 | .next 2 | dist 3 | node_modules/ 4 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-express-typescript-2", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "ts-node --project tsconfig.server.json server/index.ts", 8 | "build:server": "tsc --project tsconfig.server.json", 9 | "build:next": "next build", 10 | "build": "npm run build:next && npm run build:server", 11 | "start": "NODE_ENV=production node dist/index.js" 12 | }, 13 | "keywords": [], 14 | "author": "", 15 | "license": "ISC", 16 | "dependencies": { 17 | "express": "^4.17.1", 18 | "next": "^9.2.1", 19 | "react": "^16.12.0", 20 | "react-dom": "^16.12.0" 21 | }, 22 | "devDependencies": { 23 | "@types/express": "^4.17.2", 24 | "@types/node": "^13.7.1", 25 | "@types/react": "^16.9.19", 26 | "ts-node": "^8.6.2", 27 | "typescript": "^3.7.5" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /server/index.ts: -------------------------------------------------------------------------------- 1 | import express, { Request, Response } from "express"; 2 | import next from "next"; 3 | 4 | const dev = process.env.NODE_ENV !== "production"; 5 | const app = next({ dev }); 6 | const handle = app.getRequestHandler(); 7 | const port = process.env.PORT || 3000; 8 | 9 | (async () => { 10 | try { 11 | await app.prepare(); 12 | const server = express(); 13 | server.all("*", (req: Request, res: Response) => { 14 | return handle(req, res); 15 | }); 16 | server.listen(port, (err?: any) => { 17 | if (err) throw err; 18 | console.log(`> Ready on localhost:${port} - env ${process.env.NODE_ENV}`); 19 | }); 20 | } catch (e) { 21 | console.error(e); 22 | process.exit(1); 23 | } 24 | })(); 25 | -------------------------------------------------------------------------------- /src/pages/_error.tsx: -------------------------------------------------------------------------------- 1 | import { NextPageContext } from "next"; 2 | 3 | const Error = ({ statusCode }) => { 4 | return ( 5 |

6 | {statusCode 7 | ? `An error ${statusCode} occurred on server` 8 | : "An error occurred on client"} 9 |

10 | ); 11 | }; 12 | 13 | Error.getInitialProps = ({ res, err }: NextPageContext) => { 14 | const statusCode = res ? res.statusCode : err ? err.statusCode : 404; 15 | return { statusCode }; 16 | }; 17 | 18 | export default Error; 19 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | function IndexPage() { 2 | return
Hello World Next - Typescript - Express
; 3 | } 4 | 5 | export default IndexPage; 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "strict": false, 12 | "forceConsistentCasingInFileNames": true, 13 | "noEmit": true, 14 | "esModuleInterop": true, 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | "resolveJsonModule": true, 18 | "isolatedModules": true, 19 | "jsx": "preserve" 20 | }, 21 | "exclude": [ 22 | "node_modules" 23 | ], 24 | "include": [ 25 | "next-env.d.ts", 26 | "**/*.ts", 27 | "**/*.tsx" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /tsconfig.server.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "dist", 6 | "noEmit": false 7 | }, 8 | "include": ["server"] 9 | } 10 | --------------------------------------------------------------------------------