forked from ProjectMirador/research-and-demos
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adds webpack devServer and webpackHotDevClient
closes ProjectMirador#87 closes ProjectMirador#25
- Loading branch information
1 parent
51f477c
commit b7223e1
Showing
14 changed files
with
3,886 additions
and
1,283 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
dist/ | ||
config/ | ||
coverage/ | ||
|
||
scripts/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
const paths = require('./paths'); | ||
delete require.cache[require.resolve('./paths')]; | ||
|
||
const NODE_ENV = process.env.NODE_ENV; | ||
if (!NODE_ENV) { | ||
throw new Error( | ||
'The NODE_ENV environment variable is required but was not specified.' | ||
); | ||
} | ||
var dotenvFiles = [ | ||
`${paths.dotenv}.${NODE_ENV}.local`, | ||
`${paths.dotenv}.${NODE_ENV}`, | ||
NODE_ENV !== 'test' && `${paths.dotenv}.local`, | ||
paths.dotenv, | ||
].filter(Boolean); | ||
dotenvFiles.forEach((dotenvFile) => { | ||
if (fs.existsSync(dotenvFile)) { | ||
require('dotenv-expand')( | ||
require('dotenv').config({ | ||
path: dotenvFile, | ||
}) | ||
); | ||
} | ||
}); | ||
const appDirectory = fs.realpathSync(process.cwd()); | ||
process.env.NODE_PATH = (process.env.NODE_PATH || '') | ||
.split(path.delimiter) | ||
.filter(folder => folder && !path.isAbsolute(folder)) | ||
.map(folder => path.resolve(appDirectory, folder)) | ||
.join(path.delimiter); | ||
const REACT_APP = /^REACT_APP_/i; | ||
|
||
function getClientEnvironment(publicUrl) { | ||
const raw = Object.keys(process.env) | ||
.filter(key => REACT_APP.test(key)) | ||
.reduce( | ||
(env, key) => { | ||
env[key] = process.env[key]; | ||
return env; | ||
}, | ||
{ | ||
NODE_ENV: process.env.NODE_ENV || 'development', | ||
PUBLIC_URL: publicUrl, | ||
} | ||
); | ||
const stringified = { | ||
'process.env': Object.keys(raw).reduce((env, key) => { | ||
env[key] = JSON.stringify(raw[key]); | ||
return env; | ||
}, {}), | ||
}; | ||
|
||
return {raw, stringified}; | ||
} | ||
|
||
module.exports = getClientEnvironment; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,206 @@ | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
const resolve = require('resolve'); | ||
const webpack = require('webpack'); | ||
const PnpWebpackPlugin = require('pnp-webpack-plugin'); | ||
const HtmlWebpackPlugin = require('html-webpack-plugin'); | ||
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); | ||
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); | ||
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); | ||
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); | ||
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent'); | ||
const getClientEnvironment = require('./env'); | ||
const paths = require('./paths'); | ||
const ManifestPlugin = require('webpack-manifest-plugin'); | ||
const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); | ||
|
||
const publicPath = '/'; | ||
const publicUrl = ''; | ||
const env = getClientEnvironment(publicUrl); | ||
const cssRegex = /\.css$/; | ||
const cssModuleRegex = /\.module\.css$/; | ||
const sassRegex = /\.(scss|sass)$/; | ||
const sassModuleRegex = /\.module\.(scss|sass)$/; | ||
const getStyleLoaders = (cssOptions, preProcessor) => { | ||
const loaders = [ | ||
require.resolve('style-loader'), | ||
{ | ||
loader: require.resolve('css-loader'), | ||
options: cssOptions, | ||
}, | ||
]; | ||
if (preProcessor) { | ||
loaders.push(require.resolve(preProcessor)); | ||
} | ||
return loaders; | ||
}; | ||
module.exports = { | ||
mode: 'development', | ||
devtool: 'cheap-module-source-map', | ||
entry: [ | ||
require.resolve('react-dev-utils/webpackHotDevClient'), | ||
paths.appIndexJs, | ||
], | ||
output: { | ||
pathinfo: true, | ||
filename: 'static/js/bundle.js', | ||
chunkFilename: 'static/js/[name].chunk.js', | ||
publicPath, | ||
devtoolModuleFilenameTemplate: info => path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'), | ||
}, | ||
optimization: { | ||
splitChunks: { | ||
chunks: 'all', | ||
name: false, | ||
}, | ||
runtimeChunk: true, | ||
}, | ||
resolve: { | ||
modules: ['node_modules'].concat( | ||
process.env.NODE_PATH.split(path.delimiter).filter(Boolean), | ||
), | ||
extensions: paths.moduleFileExtensions | ||
.map(ext => `.${ext}`), | ||
alias: { | ||
'react-native': 'react-native-web', | ||
}, | ||
plugins: [ | ||
PnpWebpackPlugin, | ||
new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]), | ||
], | ||
}, | ||
resolveLoader: { | ||
plugins: [ | ||
PnpWebpackPlugin.moduleLoader(module), | ||
], | ||
}, | ||
module: { | ||
strictExportPresence: true, | ||
rules: [ | ||
{parser: { requireEnsure: false }}, | ||
{ | ||
test: /\.(js|mjs|jsx)$/, | ||
enforce: 'pre', | ||
use: [ | ||
{ | ||
options: { | ||
formatter: require.resolve('react-dev-utils/eslintFormatter'), | ||
eslintPath: require.resolve('eslint'), | ||
}, | ||
loader: require.resolve('eslint-loader'), | ||
}, | ||
], | ||
include: paths.appSrc, | ||
}, | ||
{ | ||
oneOf: [ | ||
{ | ||
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], | ||
loader: require.resolve('url-loader'), | ||
options: { | ||
limit: 10000, | ||
name: 'static/media/[name].[hash:8].[ext]', | ||
}, | ||
}, | ||
{ | ||
test: /\.(js|mjs|jsx|ts|tsx)$/, | ||
include: paths.appSrc, | ||
loader: require.resolve('babel-loader'), | ||
options: { | ||
plugins: [ | ||
[ | ||
require.resolve('babel-plugin-named-asset-import'), | ||
{ | ||
loaderMap: { | ||
svg: { | ||
ReactComponent: '@svgr/webpack?-prettier,-svgo![path]', | ||
}, | ||
}, | ||
}, | ||
], | ||
], | ||
cacheDirectory: true, | ||
cacheCompression: false, | ||
}, | ||
}, | ||
{ | ||
test: /\.(js|mjs)$/, | ||
exclude: /@babel(?:\/|\\{1,2})runtime/, | ||
loader: require.resolve('babel-loader'), | ||
options: { | ||
babelrc: false, | ||
configFile: false, | ||
compact: false, | ||
cacheDirectory: true, | ||
cacheCompression: false, | ||
sourceMaps: false, | ||
}, | ||
}, | ||
{ | ||
test: cssRegex, | ||
exclude: cssModuleRegex, | ||
use: getStyleLoaders({ | ||
importLoaders: 1, | ||
}), | ||
}, | ||
{ | ||
test: cssModuleRegex, | ||
use: getStyleLoaders({ | ||
importLoaders: 1, | ||
modules: true, | ||
getLocalIdent: getCSSModuleLocalIdent, | ||
}), | ||
}, | ||
{ | ||
test: sassRegex, | ||
exclude: sassModuleRegex, | ||
use: getStyleLoaders({importLoaders: 2}, 'sass-loader'), | ||
}, | ||
{ | ||
test: sassModuleRegex, | ||
use: getStyleLoaders( | ||
{ | ||
importLoaders: 2, | ||
modules: true, | ||
getLocalIdent: getCSSModuleLocalIdent, | ||
}, | ||
'sass-loader', | ||
), | ||
}, | ||
{ | ||
exclude: [/\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/], | ||
loader: require.resolve('file-loader'), | ||
options: { | ||
name: 'static/media/[name].[hash:8].[ext]', | ||
}, | ||
}, | ||
], | ||
}, | ||
], | ||
}, | ||
plugins: [ | ||
new HtmlWebpackPlugin({ | ||
inject: true, | ||
template: paths.appHtml, | ||
}), | ||
new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw), | ||
new ModuleNotFoundPlugin(paths.appPath), | ||
new webpack.DefinePlugin(env.stringified), | ||
new webpack.HotModuleReplacementPlugin(), | ||
new CaseSensitivePathsPlugin(), | ||
new WatchMissingNodeModulesPlugin(paths.appNodeModules), | ||
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), | ||
new ManifestPlugin({ | ||
fileName: 'asset-manifest.json', | ||
publicPath, | ||
}), | ||
].filter(Boolean), | ||
node: { | ||
dgram: 'empty', | ||
fs: 'empty', | ||
net: 'empty', | ||
tls: 'empty', | ||
child_process: 'empty', | ||
}, | ||
performance: false, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware'); | ||
const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware'); | ||
const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware'); | ||
const ignoredFiles = require('react-dev-utils/ignoredFiles'); | ||
const config = require('./webpack.config.dev'); | ||
const paths = require('./paths'); | ||
const fs = require('fs'); | ||
|
||
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; | ||
const host = process.env.HOST || '0.0.0.0'; | ||
|
||
module.exports = function (proxy, allowedHost) { | ||
return { | ||
disableHostCheck: | ||
!proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true', | ||
compress: true, | ||
clientLogLevel: 'none', | ||
contentBase: paths.appPublic, | ||
watchContentBase: true, | ||
hot: true, | ||
publicPath: config.output.publicPath, | ||
quiet: true, | ||
watchOptions: { | ||
ignored: ignoredFiles(paths.appSrc), | ||
}, | ||
https: protocol === 'https', | ||
host, | ||
overlay: false, | ||
historyApiFallback: { | ||
disableDotRule: true, | ||
}, | ||
public: allowedHost, | ||
proxy, | ||
before(app, server) { | ||
if (fs.existsSync(paths.proxySetup)) { | ||
require(paths.proxySetup)(app); | ||
} | ||
app.use(evalSourceMapMiddleware(server)); | ||
app.use(errorOverlayMiddleware()); | ||
app.use(noopServiceWorkerMiddleware()); | ||
}, | ||
}; | ||
}; |
Oops, something went wrong.