Skip to content

Commit 02c7309

Browse files
committed
Feature(env): add dotenv file support
1 parent fa46261 commit 02c7309

9 files changed

+641
-578
lines changed

.env

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
PORT=3003
2+
PORT_WEBPACK_DEV_SERVER=3004
3+
PORT_BUNDLE_ANALYZER=3005
4+
5+
POSTGRES_DB=docker
6+
POSTGRES_USER=docker
7+
POSTGRES_PASSWORD=docker

Dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
FROM node:alpine
22

3+
ARG PORT=${PORT}
4+
35
WORKDIR /usr/src/app
46
COPY . /usr/src/app/
57

68
RUN apk add --no-cache --update make gcc g++ libc-dev libpng-dev automake autoconf libtool nasm
79
RUN yarn install
810
RUN yarn build
911

10-
EXPOSE 3003
12+
EXPOSE ${PORT}
1113

1214
CMD ["yarn", "serve"]

docker-compose.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ services:
55
image: cguo/express-webpack-react-redux-typescript-boilerplate
66
build: # ignored when deploying a stack in swarm mode or kubernetes
77
context: .
8+
args:
9+
- PORT=${PORT}
810
ports:
9-
- "3003:3003"
11+
- "${PORT}:${PORT}"
1012
depends_on: # ignored when deploying a stack in swarm mode or kubernetes
1113
- postgres
1214
- redis
@@ -22,9 +24,9 @@ services:
2224
- ./backend/sql/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
2325
- ./backend/sql/data.sql:/docker-entrypoint-initdb.d/2-data.sql
2426
environment:
25-
- POSTGRES_DB=docker
26-
- POSTGRES_USER=docker
27-
- POSTGRES_PASSWORD=docker
27+
- POSTGRES_DB=${POSTGRES_DB}
28+
- POSTGRES_USER=${POSTGRES_USER}
29+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
2830
ports:
2931
- "5432:5432"
3032
restart: always # ignored when deploying a stack in swarm mode or kubernetes

frontend/src/router.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,42 @@ import ParallaxPageLoader from 'pages/ParallaxPage/components/ContentLoader';
1313
import ReactPageLoader from 'pages/ReactPage/components/ContentLoader';
1414

1515
const HomePage = Loadable({
16-
loader: () => import(/* webpackChunkName: "home-page" */ './pages/HomePage'),
16+
loader: () => import(
17+
/*
18+
webpackChunkName: "home-page",
19+
webpackPreload: true
20+
*/
21+
'./pages/HomePage'),
1722
loading: HomePageLoader,
1823
});
1924

2025
const NotFoundPage = Loadable({
21-
loader: () => import(/* webpackChunkName: "not-found-page" */ './pages/NotFoundPage'),
26+
loader: () => import(
27+
/*
28+
webpackChunkName: "not-found-page",
29+
webpackPrefetch: true
30+
*/
31+
'./pages/NotFoundPage'),
2232
loading: NotFoundPageLoader,
2333
});
2434

2535
const ParallaxPage = Loadable({
26-
loader: () => import(/* webpackChunkName: "parallax-page" */ './pages/ParallaxPage'),
36+
loader: () => import(
37+
/*
38+
webpackChunkName: "parallax-page",
39+
webpackPrefetch: true
40+
*/
41+
'./pages/ParallaxPage'),
2742
loading: ParallaxPageLoader,
2843
});
2944

3045
const ReactPage = Loadable({
31-
loader: () => import(/* webpackChunkName: "react-page" */ './pages/ReactPage'),
46+
loader: () => import(
47+
/*
48+
webpackChunkName: "react-page",
49+
webpackPrefetch: true
50+
*/
51+
'./pages/ReactPage'),
3252
loading: ReactPageLoader,
3353
});
3454

package.json

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,27 @@
3333
}
3434
},
3535
"dependencies": {
36-
"@babel/cli": "^7.0.0",
37-
"@babel/core": "^7.0.0",
36+
"@babel/cli": "^7.1.0",
37+
"@babel/core": "^7.1.0",
3838
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
39-
"@babel/preset-env": "^7.0.0",
39+
"@babel/preset-env": "^7.1.0",
4040
"@babel/preset-react": "^7.0.0",
4141
"@types/i18next": "^8.4.5",
4242
"@types/i18next-browser-languagedetector": "^2.0.1",
4343
"@types/materialize-css": "^1.0.4",
4444
"@types/prismjs": "^1.9.0",
45-
"@types/react": "^16.4.13",
45+
"@types/react": "^16.4.14",
4646
"@types/react-content-loader": "^3.1.3",
4747
"@types/react-dom": "^16.0.7",
4848
"@types/react-i18next": "^7.8.2",
4949
"@types/react-loadable": "^5.4.1",
50-
"@types/react-redux": "^6.0.7",
51-
"@types/react-router": "^4.0.30",
52-
"@types/react-router-dom": "^4.3.0",
50+
"@types/react-redux": "^6.0.9",
51+
"@types/react-router": "^4.0.31",
52+
"@types/react-router-dom": "^4.3.1",
5353
"@types/redux-logger": "^3.0.6",
5454
"@types/uuid": "^3.4.4",
5555
"@types/webpack-env": "^1.13.6",
56-
"add-asset-html-webpack-plugin": "^2.1.3",
56+
"add-asset-html-webpack-plugin": "^3.0.1",
5757
"awesome-typescript-loader": "^5.2.1",
5858
"axios": "^0.18.0",
5959
"babel-loader": "^8.0.2",
@@ -69,6 +69,7 @@
6969
"cross-env": "^5.2.0",
7070
"css-loader": "^1.0.0",
7171
"cssnano": "^4.1.0",
72+
"dotenv-webpack": "^1.5.7",
7273
"duplicate-package-checker-webpack-plugin": "^3.0.0",
7374
"express": "^4.16.3",
7475
"express-session": "^1.15.6",
@@ -77,13 +78,13 @@
7778
"history": "^4.7.2",
7879
"html-webpack-plugin": "^3.2.0",
7980
"http-status": "^1.2.0",
80-
"i18next": "^11.7.0",
81+
"i18next": "^11.9.0",
8182
"i18next-browser-languagedetector": "^2.2.3",
8283
"image-webpack-loader": "^4.3.1",
8384
"immutable": "4.0.0-rc.9",
8485
"materialize-css": "1.0.0",
8586
"mini-css-extract-plugin": "^0.4.2",
86-
"morgan": "^1.9.0",
87+
"morgan": "^1.9.1",
8788
"node-sass": "^4.9.3",
8889
"nodemon": "^1.18.4",
8990
"offline-plugin": "^5.0.5",
@@ -94,10 +95,10 @@
9495
"postcss-preset-env": "^5.3.0",
9596
"prismjs": "^1.15.0",
9697
"progress-bar-webpack-plugin": "^1.11.0",
97-
"react": "^16.5.0",
98+
"react": "^16.5.1",
9899
"react-content-loader": "^3.1.2",
99-
"react-dom": "^16.5.0",
100-
"react-hot-loader": "^4.3.6",
100+
"react-dom": "^16.5.1",
101+
"react-hot-loader": "^4.3.8",
101102
"react-i18next": "^7.12.0",
102103
"react-loadable": "^5.5.0",
103104
"react-redux": "^5.0.7",
@@ -109,12 +110,12 @@
109110
"sass-loader": "^7.1.0",
110111
"style-loader": "^0.23.0",
111112
"trash-cli": "^1.4.0",
112-
"ts-loader": "^5.1.0",
113+
"ts-loader": "^5.1.1",
113114
"typescript": "^3.0.3",
114115
"url-loader": "^1.1.1",
115116
"uuid": "^3.3.2",
116-
"webpack": "^4.17.2",
117-
"webpack-bundle-analyzer": "^2.13.1",
117+
"webpack": "^4.19.0",
118+
"webpack-bundle-analyzer": "^3.0.2",
118119
"webpack-cli": "^3.1.0",
119120
"webpack-merge": "^4.1.4",
120121
"webpack-pwa-manifest": "^3.7.1"
@@ -124,19 +125,21 @@
124125
"@types/jest": "^23.3.2",
125126
"@types/react-test-renderer": "^16.0.2",
126127
"babel-core": "^7.0.0-bridge.0",
128+
"case-sensitive-paths-webpack-plugin": "^2.1.2",
127129
"commitlint": "^7.1.2",
128130
"commitlint-config-armour": "^1.2.1",
129131
"coveralls": "^3.0.2",
130-
"eslint": "^5.5.0",
132+
"dotenv": "^6.0.0",
133+
"eslint": "^5.6.0",
131134
"eslint-config-airbnb": "^17.1.0",
132135
"eslint-import-resolver-webpack": "^0.10.1",
133136
"eslint-plugin-import": "^2.14.0",
134137
"eslint-plugin-jsx-a11y": "^6.1.1",
135138
"eslint-plugin-react": "^7.11.1",
136-
"husky": "1.0.0-rc.13",
139+
"husky": "1.0.0-rc.14",
137140
"identity-obj-proxy": "^3.0.0",
138-
"jest": "^23.5.0",
139-
"react-test-renderer": "^16.5.0",
141+
"jest": "^23.6.0",
142+
"react-test-renderer": "^16.5.1",
140143
"stylelint": "^9.5.0",
141144
"stylelint-config-standard": "^18.2.0",
142145
"ts-jest": "^23.1.4",

webpack.config.base.babel.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dotenv/config'; // Allow webpack config file to use .env variables
2+
13
import path from 'path';
24
import webpack from 'webpack';
35

@@ -6,7 +8,9 @@ import postcssImport from 'postcss-import';
68
import postcssPresetEnv from 'postcss-preset-env';
79

810
import AddAssetHtmlPlugin from 'add-asset-html-webpack-plugin';
11+
import CaseSensitivePathsPlugin from 'case-sensitive-paths-webpack-plugin';
912
import CopyWebpackPlugin from 'copy-webpack-plugin';
13+
import DotenvPlugin from 'dotenv-webpack';
1014
import DuplicatePackageCheckerPlugin from 'duplicate-package-checker-webpack-plugin';
1115
import HtmlWebpackPlugin from 'html-webpack-plugin';
1216
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
@@ -118,6 +122,10 @@ export default {
118122

119123
// A list of used webpack plugins
120124
plugins: [
125+
// Enforces case sensitive paths.
126+
new CaseSensitivePathsPlugin(),
127+
// Supports dotenv file
128+
new DotenvPlugin(),
121129
// Warns when multiple versions of the same package exist in a build
122130
new DuplicatePackageCheckerPlugin(),
123131
// Load pre-build dll reference files

webpack.config.dev.babel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ export default merge(BaseWebpackConfig, {
2323

2424
devServer: {
2525
// Port number for webpack dev server
26-
port: 3004,
26+
port: process.env.PORT_WEBPACK_DEV_SERVER || 3004,
2727
// Add proxy for api call
2828
proxy: {
2929
'/api/v1': {
30-
target: 'http://localhost:3003/',
30+
target: `http://localhost:${process.env.PORT || 3003}/`,
3131
secure: false,
3232
},
3333
},

webpack.config.profile.babel.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default merge(ProdWebpackConfig, {
88
plugins: [
99
// Webpack bundle analyzer for profiling
1010
new BundleAnalyzerPlugin({
11-
analyzerPort: 3003,
11+
analyzerPort: process.env.PORT_BUNDLE_ANALYZER || 3005,
1212
generateStatsFile: true,
1313
}),
1414
],

0 commit comments

Comments
 (0)