Created
March 3, 2019 12:03
-
-
Save velopert/1f6abf743d882bc73aa46418c6ded8c2 to your computer and use it in GitHub Desktop.
Webpack v4 config for React SSR
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
const nodeExternals = require('webpack-node-externals'); | |
const webpack = require('webpack'); | |
const getClientEnvironment = require('./env'); | |
const paths = require('./paths'); | |
const cssRegex = /\.css$/; | |
const cssModuleRegex = /\.module\.css$/; | |
const sassRegex = /\.(scss|sass)$/; | |
const sassModuleRegex = /\.module\.(scss|sass)$/; | |
const publicUrl = paths.servedPath.slice(0, -1); | |
const env = getClientEnvironment(publicUrl); | |
module.exports = { | |
mode: 'production', | |
entry: paths.ssrIndexJs, | |
target: 'node', | |
output: { | |
path: paths.ssrBuild, | |
filename: 'server.js', | |
chunkFilename: 'js/[name].chunk.js' | |
}, | |
module: { | |
rules: [ | |
{ | |
oneOf: [ | |
// 자바스크립트를 위한 처리 | |
// 기존 webpack.config.js 를 참고하여 작성 | |
{ | |
test: /\.(js|mjs|jsx|ts|tsx)$/, | |
include: paths.appSrc, | |
loader: require.resolve('babel-loader'), | |
options: { | |
customize: require.resolve( | |
'babel-preset-react-app/webpack-overrides' | |
), | |
plugins: [ | |
[ | |
require.resolve('babel-plugin-named-asset-import'), | |
{ | |
loaderMap: { | |
svg: { | |
ReactComponent: '@svgr/webpack?-svgo![path]' | |
} | |
} | |
} | |
] | |
], | |
cacheDirectory: true, | |
cacheCompression: false, | |
compact: false | |
} | |
}, | |
// CSS 를 위한 처리 | |
{ | |
test: cssRegex, | |
exclude: cssModuleRegex, | |
// css-loader/locals 를 사용해야 실제 css 파일을 생성하지 않습니다. | |
loader: require.resolve('css-loader/locals') | |
}, | |
// CSS Module 을 위한 처리 | |
{ | |
test: cssModuleRegex, | |
loader: require.resolve('css-loader/locals'), | |
options: { | |
modules: true | |
} | |
}, | |
// Sass 를 위한 처리 | |
{ | |
test: sassRegex, | |
exclude: sassModuleRegex, | |
use: [ | |
require.resolve('css-loader/locals'), | |
require.resolve('sass-loader') | |
] | |
}, | |
// Sass + CSS Module 을 위한 처리 | |
{ | |
test: sassRegex, | |
exclude: sassModuleRegex, | |
use: [ | |
{ | |
loader: require.resolve('css-loader/locals'), | |
options: { | |
modules: true | |
} | |
}, | |
require.resolve('sass-loader') | |
] | |
}, | |
// url-loader 를 위한 설정 | |
{ | |
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], | |
loader: require.resolve('url-loader'), | |
options: { | |
emitFile: false, // 이 설정이 중요합니다. | |
limit: 10000, // 원래는 9.76KB가 넘어가면 파일로 저장하는데 | |
// emitFile 값이 false 일땐 경로만 준비하고 파일은 저장하지 않습니다. | |
name: 'static/media/[name].[hash:8].[ext]' | |
} | |
}, | |
// 위에서 설정된 확장자를 제외한 파일들은 | |
// file-loader 를 사용합니다. | |
{ | |
loader: require.resolve('file-loader'), | |
exclude: [/\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/], | |
options: { | |
emitFile: false, // 파일을 저장하지 않습니다. | |
name: 'static/media/[name].[hash:8].[ext]' | |
} | |
} | |
] | |
} | |
] | |
}, | |
resolve: { | |
modules: ['node_modules'] | |
}, | |
externals: [nodeExternals()], | |
plugins: [ | |
new webpack.DefinePlugin(env.stringified) // 환경변수를 주입해줍니다. | |
] | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment