mirror of
https://github.com/aleleba/create-react-ssr.git
synced 2025-01-09 21:46:56 -06:00
PR-492498: changing some webpack configuration and updating packages.
This commit is contained in:
parent
1086989101
commit
9c2c283f61
@ -9,8 +9,8 @@ Tech(Library or Framework) | Version |
|
|||||||
React (Render Library) | 18.2.0
|
React (Render Library) | 18.2.0
|
||||||
Redux (Global State Management) | 4.2.0
|
Redux (Global State Management) | 4.2.0
|
||||||
React Router DOM (Routing) | 6.3.0
|
React Router DOM (Routing) | 6.3.0
|
||||||
Jest (Testing) | 28.1.3
|
Jest (Testing) | 29.0.1
|
||||||
Typescript | 4.7.4
|
Typescript | 4.8.2
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
To create a new project run in the terminal:
|
To create a new project run in the terminal:
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
const config = {
|
export const config = {
|
||||||
env: process.env.ENV ? process.env.ENV : 'production',
|
ENV: process.env.ENV,
|
||||||
port: process.env.PORT ? process.env.PORT : 80,
|
PORT: process.env.PORT,
|
||||||
|
PUBLIC_URL: process.env.PUBLIC_URL,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export const deFaultValues = {
|
||||||
|
ENV: 'production',
|
||||||
|
PORT: 80,
|
||||||
|
PUBLIC_URL: '/',
|
||||||
|
}
|
2425
package-lock.json
generated
2425
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
35
package.json
35
package.json
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@aleleba/create-react-ssr",
|
"name": "@aleleba/create-react-ssr",
|
||||||
"version": "3.3.0",
|
"version": "3.4.0",
|
||||||
"description": "Starter Kit of server side render of react",
|
"description": "Starter Kit of server side render of react",
|
||||||
"bin": "./bin/cli.js",
|
"bin": "./bin/cli.js",
|
||||||
"main": "src/server/index",
|
"main": "src/server/index",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node build/server/app-server.js",
|
"start": "node build/server/app-server.js",
|
||||||
"start:dev": "rm -rf build && webpack --mode=development --config webpack.config.dev.server.ts && node build/server.js",
|
"start:dev": "rm -rf build && webpack --mode=development --config webpack.config.dev.server.ts",
|
||||||
"build": "webpack-cli --config webpack.config.ts",
|
"build": "webpack-cli --config webpack.config.ts",
|
||||||
"lint": "eslint ./ --ext .js --ext .ts --ext .jsx --ext .tsx",
|
"lint": "eslint ./ --ext .js --ext .ts --ext .jsx --ext .tsx",
|
||||||
"lint:fix": "eslint ./ --ext .js --ext .ts --ext .jsx --ext .tsx --fix",
|
"lint:fix": "eslint ./ --ext .js --ext .ts --ext .jsx --ext .tsx --fix",
|
||||||
@ -35,7 +35,7 @@
|
|||||||
"asset-require-hook": "^1.2.0",
|
"asset-require-hook": "^1.2.0",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"express": "^4.18.1",
|
"express": "^4.18.1",
|
||||||
"helmet": "^5.1.1",
|
"helmet": "^6.0.0",
|
||||||
"ignore-styles": "^5.0.1",
|
"ignore-styles": "^5.0.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
@ -67,45 +67,46 @@
|
|||||||
"@testing-library/jest-dom": "^5.16.5",
|
"@testing-library/jest-dom": "^5.16.5",
|
||||||
"@testing-library/react": "^13.3.0",
|
"@testing-library/react": "^13.3.0",
|
||||||
"@testing-library/user-event": "^14.4.3",
|
"@testing-library/user-event": "^14.4.3",
|
||||||
"@types/jest": "^28.1.7",
|
"@types/jest": "^29.0.0",
|
||||||
"@types/node": "^18.7.11",
|
"@types/node": "^18.7.14",
|
||||||
"@types/react": "^18.0.17",
|
"@types/react": "^18.0.18",
|
||||||
"@types/react-dom": "^18.0.6",
|
"@types/react-dom": "^18.0.6",
|
||||||
"@types/webpack": "^5.28.0",
|
"@types/webpack": "^5.28.0",
|
||||||
"@types/webpack-hot-middleware": "^2.25.6",
|
"@types/webpack-hot-middleware": "^2.25.6",
|
||||||
"@types/webpack-node-externals": "^2.5.3",
|
"@types/webpack-node-externals": "^2.5.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.34.0",
|
"@typescript-eslint/eslint-plugin": "^5.36.1",
|
||||||
"@typescript-eslint/parser": "^5.34.0",
|
"@typescript-eslint/parser": "^5.36.1",
|
||||||
"babel-jest": "^28.1.3",
|
"babel-jest": "^29.0.1",
|
||||||
"babel-loader": "^8.2.5",
|
"babel-loader": "^8.2.5",
|
||||||
"clean-webpack-plugin": "^4.0.0",
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"compression-webpack-plugin": "^10.0.0",
|
"compression-webpack-plugin": "^10.0.0",
|
||||||
"copy-webpack-plugin": "^11.0.0",
|
"copy-webpack-plugin": "^11.0.0",
|
||||||
"css-loader": "^6.7.1",
|
"css-loader": "^6.7.1",
|
||||||
"css-minimizer-webpack-plugin": "^4.0.0",
|
"css-minimizer-webpack-plugin": "^4.0.0",
|
||||||
"eslint": "^8.22.0",
|
"eslint": "^8.23.0",
|
||||||
"eslint-plugin-react": "^7.30.1",
|
"eslint-plugin-react": "^7.31.1",
|
||||||
"eslint-webpack-plugin": "^3.2.0",
|
"eslint-webpack-plugin": "^3.2.0",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jest": "^28.1.3",
|
"jest": "^29.0.1",
|
||||||
"jest-environment-jsdom": "^28.1.3",
|
"jest-environment-jsdom": "^29.0.1",
|
||||||
"jest-fetch-mock": "^3.0.3",
|
"jest-fetch-mock": "^3.0.3",
|
||||||
"mini-css-extract-plugin": "^2.6.1",
|
"mini-css-extract-plugin": "^2.6.1",
|
||||||
"react-refresh": "^0.14.0",
|
"react-refresh": "^0.14.0",
|
||||||
"redux-devtools-extension": "^2.13.9",
|
"redux-devtools-extension": "^2.13.9",
|
||||||
"sass": "^1.54.5",
|
"sass": "^1.54.6",
|
||||||
"sass-loader": "^13.0.2",
|
"sass-loader": "^13.0.2",
|
||||||
"style-loader": "^3.3.1",
|
"style-loader": "^3.3.1",
|
||||||
"terser-webpack-plugin": "^5.3.5",
|
"terser-webpack-plugin": "^5.3.6",
|
||||||
"ts-loader": "^9.3.1",
|
"ts-loader": "^9.3.1",
|
||||||
"typescript": "^4.7.4",
|
"typescript": "^4.8.2",
|
||||||
"url-loader": "^4.1.1",
|
"url-loader": "^4.1.1",
|
||||||
"webpack-cli": "^4.10.0",
|
"webpack-cli": "^4.10.0",
|
||||||
"webpack-dev-middleware": "^5.3.3",
|
"webpack-dev-middleware": "^5.3.3",
|
||||||
"webpack-dev-server": "^4.10.0",
|
"webpack-dev-server": "^4.10.1",
|
||||||
"webpack-hot-middleware": "^2.25.2",
|
"webpack-hot-middleware": "^2.25.2",
|
||||||
"webpack-node-externals": "^3.0.0",
|
"webpack-node-externals": "^3.0.0",
|
||||||
|
"webpack-shell-plugin-next": "^2.2.2",
|
||||||
"workbox-webpack-plugin": "^6.5.4",
|
"workbox-webpack-plugin": "^6.5.4",
|
||||||
"workbox-window": "^6.5.4"
|
"workbox-window": "^6.5.4"
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import { BrowserRouter as Router } from 'react-router-dom';
|
|||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { IInitialState } from './reducers/index';
|
import { IInitialState } from './reducers/index';
|
||||||
import setStore from './setStore';
|
import setStore from './setStore';
|
||||||
import config from '../../config';
|
import { config } from '../../config';
|
||||||
|
|
||||||
import './styles/global.scss';
|
import './styles/global.scss';
|
||||||
import App from './components/App';
|
import App from './components/App';
|
||||||
@ -28,7 +28,7 @@ interface IHot {
|
|||||||
accept: any
|
accept: any
|
||||||
}
|
}
|
||||||
|
|
||||||
const { env } = config;
|
const { ENV } = config;
|
||||||
|
|
||||||
const preloadedState = window.__PRELOADED_STATE__;
|
const preloadedState = window.__PRELOADED_STATE__;
|
||||||
const store = setStore({ initialState: preloadedState });
|
const store = setStore({ initialState: preloadedState });
|
||||||
@ -37,7 +37,7 @@ delete window.__PRELOADED_STATE__;
|
|||||||
|
|
||||||
const container = document.getElementById('app')!;
|
const container = document.getElementById('app')!;
|
||||||
|
|
||||||
if(env === 'development') {
|
if(ENV === 'development') {
|
||||||
const root = createRoot(container);
|
const root = createRoot(container);
|
||||||
root.render(
|
root.render(
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
@ -49,7 +49,7 @@ if(env === 'development') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add "const root" to be able to rerender.
|
// add "const root" to be able to rerender.
|
||||||
env === 'production' && hydrateRoot(container,
|
ENV === 'production' && hydrateRoot(container,
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<Router>
|
<Router>
|
||||||
<App />
|
<App />
|
||||||
@ -72,7 +72,7 @@ env === 'production' && hydrateRoot(container,
|
|||||||
</Provider>
|
</Provider>
|
||||||
); */
|
); */
|
||||||
|
|
||||||
if((env) && (env === 'production')){
|
if((ENV) && (ENV === 'production')){
|
||||||
serviceWorkerRegistration();
|
serviceWorkerRegistration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,18 +2,18 @@
|
|||||||
import { legacy_createStore as createStore} from 'redux'; //, applyMiddleware
|
import { legacy_createStore as createStore} from 'redux'; //, applyMiddleware
|
||||||
// import { Provider } from 'react-redux';
|
// import { Provider } from 'react-redux';
|
||||||
import { composeWithDevTools as composeWithDevToolsWeb } from 'redux-devtools-extension';
|
import { composeWithDevTools as composeWithDevToolsWeb } from 'redux-devtools-extension';
|
||||||
import config from '../../config';
|
import { config } from '../../config';
|
||||||
import reducer, { IInitialState } from './reducers';
|
import reducer, { IInitialState } from './reducers';
|
||||||
|
|
||||||
|
|
||||||
const { env } = config;
|
const { ENV } = config;
|
||||||
|
|
||||||
const composeEnhancers = composeWithDevToolsWeb({
|
const composeEnhancers = composeWithDevToolsWeb({
|
||||||
// Specify here name, actionsBlacklist, actionsCreators and other options
|
// Specify here name, actionsBlacklist, actionsCreators and other options
|
||||||
});
|
});
|
||||||
|
|
||||||
const setStore = ({ initialState }: { initialState: IInitialState | undefined }) => {
|
const setStore = ({ initialState }: { initialState: IInitialState | undefined }) => {
|
||||||
const store = env === 'development' ? createStore(
|
const store = ENV === 'development' ? createStore(
|
||||||
reducer,
|
reducer,
|
||||||
initialState,
|
initialState,
|
||||||
composeEnhancers(),
|
composeEnhancers(),
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import webpack from 'webpack';
|
import webpack from 'webpack';
|
||||||
import helmet from 'helmet';
|
import helmet from 'helmet';
|
||||||
import config from '../../config';
|
import { config } from '../../config';
|
||||||
|
|
||||||
//Dependencies of HotReloading
|
//Dependencies of HotReloading
|
||||||
import webpackConfig from '../../webpack.config.dev';
|
import webpackConfig from '../../webpack.config.dev';
|
||||||
@ -24,7 +24,7 @@ import { getHashManifest, haveVendorsCss } from './utilsServer';
|
|||||||
//App
|
//App
|
||||||
import App from '../frontend/components/App';
|
import App from '../frontend/components/App';
|
||||||
|
|
||||||
const { env, port } = config;
|
const { ENV, PORT } = config;
|
||||||
|
|
||||||
const routesUrls = routes.map( route => route.path);
|
const routesUrls = routes.map( route => route.path);
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ const app = express();
|
|||||||
|
|
||||||
// @ts-ignore:next-line
|
// @ts-ignore:next-line
|
||||||
const compiler = webpack(webpackConfig);
|
const compiler = webpack(webpackConfig);
|
||||||
if(env === 'development'){
|
if(ENV === 'development'){
|
||||||
const serverConfig = {
|
const serverConfig = {
|
||||||
serverSideRender: true,
|
serverSideRender: true,
|
||||||
publicPath: webpackConfig.output?.publicPath,
|
publicPath: webpackConfig.output?.publicPath,
|
||||||
@ -122,6 +122,6 @@ app
|
|||||||
.get('*', renderApp);
|
.get('*', renderApp);
|
||||||
|
|
||||||
|
|
||||||
app.listen(port, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Server running on port ${port}`);
|
console.log(`Server running on port ${PORT}`);
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import config from '../../config';
|
import { config } from '../../config';
|
||||||
|
|
||||||
const { env } = config
|
const { ENV } = config;
|
||||||
|
|
||||||
export const getHashManifest = () => {
|
export const getHashManifest = () => {
|
||||||
try {
|
try {
|
||||||
@ -18,8 +18,8 @@ export const haveVendorsCss = (manifest, memoryFs) => {
|
|||||||
try {
|
try {
|
||||||
const baseUrl = __dirname.replace(/\/server(.*)/,'');
|
const baseUrl = __dirname.replace(/\/server(.*)/,'');
|
||||||
const fullURL = `${baseUrl}${manifest ? manifest['vendors.css'] : '/build/assets/vendors.css'}`;
|
const fullURL = `${baseUrl}${manifest ? manifest['vendors.css'] : '/build/assets/vendors.css'}`;
|
||||||
env === 'production' && fs.readFileSync(fullURL).toString();
|
ENV === 'production' && fs.readFileSync(fullURL).toString();
|
||||||
env === 'development' && memoryFs.readFileSync(fullURL).toString();
|
ENV === 'development' && memoryFs.readFileSync(fullURL).toString();
|
||||||
return true
|
return true
|
||||||
}catch(err){
|
}catch(err){
|
||||||
// console.error(err);
|
// console.error(err);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||||
import webpackNodeExternals from 'webpack-node-externals';
|
import webpackNodeExternals from 'webpack-node-externals';
|
||||||
|
import WebpackShellPluginNext from 'webpack-shell-plugin-next';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { Configuration } from 'webpack';
|
import { Configuration } from 'webpack';
|
||||||
const ROOT_DIR = path.resolve(__dirname);
|
const ROOT_DIR = path.resolve(__dirname);
|
||||||
@ -57,7 +58,7 @@ const config: Configuration = {
|
|||||||
test: fontsAndImagesExtensions,
|
test: fontsAndImagesExtensions,
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: '/assets/media/[name].[ext]',
|
name: '/assets/[name].[ext]',
|
||||||
emitFile: false,
|
emitFile: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -82,6 +83,13 @@ const config: Configuration = {
|
|||||||
new MiniCssExtractPlugin({
|
new MiniCssExtractPlugin({
|
||||||
filename: 'assets/app.css',
|
filename: 'assets/app.css',
|
||||||
}),
|
}),
|
||||||
|
new WebpackShellPluginNext({
|
||||||
|
onBuildEnd: {
|
||||||
|
scripts: ['node build/server.js'],
|
||||||
|
blocking: false,
|
||||||
|
parallel: true
|
||||||
|
}
|
||||||
|
})
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,24 +1,43 @@
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as dotenv from 'dotenv';
|
import fs from 'fs';
|
||||||
|
import { deFaultValues } from './config';
|
||||||
import webpack, { Configuration } from 'webpack';
|
import webpack, { Configuration } from 'webpack';
|
||||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||||
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
||||||
import ESLintPlugin from 'eslint-webpack-plugin';
|
import ESLintPlugin from 'eslint-webpack-plugin';
|
||||||
import CopyPlugin from 'copy-webpack-plugin';
|
import CopyPlugin from 'copy-webpack-plugin';
|
||||||
|
|
||||||
const dotEnvToParse = dotenv.config();
|
|
||||||
|
|
||||||
const ROOT_DIR = path.resolve(__dirname);
|
const ROOT_DIR = path.resolve(__dirname);
|
||||||
const resolvePath = (...args: string[]) => path.resolve(ROOT_DIR, ...args);
|
const resolvePath = (...args: string[]) => path.resolve(ROOT_DIR, ...args);
|
||||||
const BUILD_DIR = resolvePath('build');
|
const BUILD_DIR = resolvePath('build');
|
||||||
const PUBLIC_URL = process.env.PUBLIC_URL || '/';
|
|
||||||
|
const copyPatterns = [
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/../public/manifest.json`, to: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/../public/favicon.ico`, to: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/../public/logo192.png`, to: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/../public/logo512.png`, to: '',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
if(fs.existsSync(`${ROOT_DIR}/../public/img`)){
|
||||||
|
copyPatterns.push({
|
||||||
|
from: `${ROOT_DIR}/../public/img`, to: 'assets/img',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const config: Configuration = {
|
const config: Configuration = {
|
||||||
entry: ['webpack-hot-middleware/client?path=/reload_wss&timeout=2000&reload=true&autoConnect=true', `${ROOT_DIR}/../src/frontend/index.tsx`],
|
entry: ['webpack-hot-middleware/client?path=/reload_wss&timeout=2000&reload=true&autoConnect=true', `${ROOT_DIR}/../src/frontend/index.tsx`],
|
||||||
output: {
|
output: {
|
||||||
path: BUILD_DIR,
|
path: BUILD_DIR,
|
||||||
filename: 'assets/app.js',
|
filename: 'assets/app.js',
|
||||||
publicPath: PUBLIC_URL,
|
publicPath: deFaultValues.PUBLIC_URL,
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: ['.js', '.jsx','.ts','.tsx', '.json'],
|
extensions: ['.js', '.jsx','.ts','.tsx', '.json'],
|
||||||
@ -52,7 +71,7 @@ const config: Configuration = {
|
|||||||
test: /\.(png|jpg|jpeg|gif|svg|ico|mp4|avi|ttf|otf|eot|woff|woff2|pdf)$/,
|
test: /\.(png|jpg|jpeg|gif|svg|ico|mp4|avi|ttf|otf|eot|woff|woff2|pdf)$/,
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: 'assets/media/[name].[ext]',
|
name: 'assets/[name].[ext]',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -72,25 +91,11 @@ const config: Configuration = {
|
|||||||
filename: 'assets/[name].css',
|
filename: 'assets/[name].css',
|
||||||
}),
|
}),
|
||||||
new ESLintPlugin(),
|
new ESLintPlugin(),
|
||||||
new webpack.DefinePlugin({
|
new webpack.EnvironmentPlugin({
|
||||||
'process.env': JSON.stringify(dotEnvToParse.parsed),
|
...deFaultValues,
|
||||||
'process.env.PUBLIC_URL': JSON.stringify(PUBLIC_URL),
|
|
||||||
}),
|
}),
|
||||||
new CopyPlugin({
|
new CopyPlugin({
|
||||||
patterns: [
|
patterns: copyPatterns
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/../public/manifest.json`, to: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/../public/favicon.ico`, to: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/../public/logo192.png`, to: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/../public/logo512.png`, to: '',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
optimization: {
|
optimization: {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as dotenv from 'dotenv';
|
import fs from 'fs';
|
||||||
|
import { deFaultValues } from './config';
|
||||||
import webpack from 'webpack';
|
import webpack from 'webpack';
|
||||||
import CompressionWebpackPlugin from 'compression-webpack-plugin';
|
import CompressionWebpackPlugin from 'compression-webpack-plugin';
|
||||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||||
@ -10,14 +11,33 @@ import { CleanWebpackPlugin } from 'clean-webpack-plugin';
|
|||||||
import ESLintPlugin from 'eslint-webpack-plugin';
|
import ESLintPlugin from 'eslint-webpack-plugin';
|
||||||
import CopyPlugin from 'copy-webpack-plugin';
|
import CopyPlugin from 'copy-webpack-plugin';
|
||||||
|
|
||||||
const dotEnvToParse = dotenv.config();
|
|
||||||
|
|
||||||
const ROOT_DIR = path.resolve(__dirname);
|
const ROOT_DIR = path.resolve(__dirname);
|
||||||
const resolvePath = (...args) => path.resolve(ROOT_DIR, ...args);
|
const resolvePath = (...args) => path.resolve(ROOT_DIR, ...args);
|
||||||
const BUILD_DIR = resolvePath('build');
|
const BUILD_DIR = resolvePath('build');
|
||||||
const { InjectManifest } = require('workbox-webpack-plugin');
|
const { InjectManifest } = require('workbox-webpack-plugin');
|
||||||
const nodeExternals = require('webpack-node-externals');
|
const nodeExternals = require('webpack-node-externals');
|
||||||
const PUBLIC_URL = process.env.PUBLIC_URL || '/';
|
|
||||||
|
const copyPatterns = [
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/public/manifest.json`, to: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/public/favicon.ico`, to: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/public/logo192.png`, to: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: `${ROOT_DIR}/public/logo512.png`, to: '',
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
if(fs.existsSync(`${ROOT_DIR}/public/img`)){
|
||||||
|
copyPatterns.push({
|
||||||
|
from: `${ROOT_DIR}/public/img`, to: 'assets/img',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const frontendConfig = {
|
const frontendConfig = {
|
||||||
entry: {
|
entry: {
|
||||||
@ -26,7 +46,7 @@ const frontendConfig = {
|
|||||||
output: {
|
output: {
|
||||||
path: BUILD_DIR,
|
path: BUILD_DIR,
|
||||||
filename: 'assets/app-[name]-[fullhash].js',
|
filename: 'assets/app-[name]-[fullhash].js',
|
||||||
publicPath: PUBLIC_URL,
|
publicPath: deFaultValues.PUBLIC_URL,
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: ['.js', '.jsx','.ts','.tsx', '.json'],
|
extensions: ['.js', '.jsx','.ts','.tsx', '.json'],
|
||||||
@ -57,7 +77,7 @@ const frontendConfig = {
|
|||||||
test: /\.(png|jpg|jpeg|gif|svg|ico|mp4|avi|ttf|otf|eot|woff|woff2|pdf)$/,
|
test: /\.(png|jpg|jpeg|gif|svg|ico|mp4|avi|ttf|otf|eot|woff|woff2|pdf)$/,
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: 'assets/media/[name].[ext]',
|
name: 'assets/[name].[ext]',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -88,25 +108,11 @@ const frontendConfig = {
|
|||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
new ESLintPlugin(),
|
new ESLintPlugin(),
|
||||||
new webpack.DefinePlugin({
|
new webpack.EnvironmentPlugin({
|
||||||
'process.env': JSON.stringify(dotEnvToParse.parsed),
|
...deFaultValues,
|
||||||
'process.env.PUBLIC_URL': JSON.stringify(PUBLIC_URL),
|
|
||||||
}),
|
}),
|
||||||
new CopyPlugin({
|
new CopyPlugin({
|
||||||
patterns: [
|
patterns: copyPatterns
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/public/manifest.json`, to: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/public/favicon.ico`, to: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/public/logo192.png`, to: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
from: `${ROOT_DIR}/public/logo512.png`, to: '',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}),
|
}),
|
||||||
new InjectManifest({
|
new InjectManifest({
|
||||||
swSrc: './service-worker.ts',
|
swSrc: './service-worker.ts',
|
||||||
@ -148,7 +154,7 @@ const serverConfig = {
|
|||||||
output: {
|
output: {
|
||||||
path: path.resolve(__dirname, 'build'),
|
path: path.resolve(__dirname, 'build'),
|
||||||
filename: 'server/app-[name].js',
|
filename: 'server/app-[name].js',
|
||||||
publicPath: PUBLIC_URL,
|
publicPath: deFaultValues.PUBLIC_URL,
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: ['.js', '.jsx','.ts','.tsx', '.json'],
|
extensions: ['.js', '.jsx','.ts','.tsx', '.json'],
|
||||||
@ -179,7 +185,7 @@ const serverConfig = {
|
|||||||
test: /\.(png|jpg|jpeg|gif|svg|ico|mp4|avi|ttf|otf|eot|woff|woff2|pdf)$/,
|
test: /\.(png|jpg|jpeg|gif|svg|ico|mp4|avi|ttf|otf|eot|woff|woff2|pdf)$/,
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: 'assets/media/[name].[ext]',
|
name: 'assets/[name].[ext]',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -205,9 +211,8 @@ const serverConfig = {
|
|||||||
}),
|
}),
|
||||||
new CleanWebpackPlugin(),
|
new CleanWebpackPlugin(),
|
||||||
new ESLintPlugin(),
|
new ESLintPlugin(),
|
||||||
new webpack.DefinePlugin({
|
new webpack.EnvironmentPlugin({
|
||||||
'process.env': JSON.stringify(dotEnvToParse.parsed),
|
...deFaultValues,
|
||||||
'process.env.PUBLIC_URL': JSON.stringify(PUBLIC_URL),
|
|
||||||
}),
|
}),
|
||||||
new InjectManifest({
|
new InjectManifest({
|
||||||
swSrc: './service-worker.ts',
|
swSrc: './service-worker.ts',
|
||||||
|
Loading…
Reference in New Issue
Block a user