๋ค์ 8์์ ๋ค์ 9๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด๋
next build
ํ๋ฉด ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ฌ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋น๋ ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก, 20 ๊ฐ์ ๊ฒฝ๋ก๊ฐ ๋ค์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
๋ฌด์์ด ์๋ชป๋์๋์ง ์ ํ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌํํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. Next 8์ ๋ฌธ์ ์์ด ์ปดํ์ผ๋์ง๋ง Next9๋ ์ปดํ์ผ๋์ง ์์ต๋๋ค.
๋ค์์ ์คํ ์ถ์ ์ ๋๋ค. ๋ ์ค๋ช ์ ์ธ ์ถ๋ ฅ์ ์ป๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ๊ฒฝ์ฐ ์๋ ค ์ฃผ์๋ฉด ๋ค์์ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
<--- Last few GCs --->
[28143:0x102634000] 231190 ms: Mark-sweep 1278.7 (1441.0) -> 1263.4 (1438.5) MB, 838.4 / 0.0 ms (average mu = 0.290, current mu = 0.268) allocation failure scavenge might not succeed
[28143:0x102634000] 231308 ms: Scavenge 1278.1 (1438.5) -> 1266.6 (1440.0) MB, 8.2 / 0.0 ms (average mu = 0.290, current mu = 0.268) allocation failure
[28143:0x102634000] 231365 ms: Scavenge 1279.3 (1440.0) -> 1271.6 (1443.0) MB, 21.6 / 0.0 ms (average mu = 0.290, current mu = 0.268) allocation failure
<--- JS stacktrace --->
==== JS stack trace =========================================
0: ExitFrame [pc: 0x3547db9dbe3d]
Security context: 0x3a36ebf9e6e1 <JSObject>
1: DoJoin(aka DoJoin) [0x3a36ebf85e89] [native array.js:~87] [pc=0x3547dcd9a7d0](this=0x3a366f3826f1 <undefined>,l=0x3a368f6eb2b9 <JSArray[10]>,m=10,A=0x3a366f3828c9 <true>,w=0x3a36c3aafc69 <String[1]: />,v=0x3a366f3829a1 <false>)
2: Join(aka Join) [0x3a36ebf85ed9] [native array.js:~112] [pc=0x3547dd85bb38](this=0x3a366f3826f1 <undefined>,l=0x3a368f6...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 0x10003ae75 node::Abort() [/usr/local/bin/node]
2: 0x10003b07f node::OnFatalError(char const*, char const*) [/usr/local/bin/node]
3: 0x1001a7ae5 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/bin/node]
4: 0x100572ef2 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/usr/local/bin/node]
5: 0x1005759c5 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/usr/local/bin/node]
6: 0x10057186f v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/usr/local/bin/node]
7: 0x10056fa44 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/local/bin/node]
8: 0x10057c2dc v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/bin/node]
9: 0x10057c35f v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/bin/node]
10: 0x10054e1e4 v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/local/bin/node]
11: 0x10082784d v8::internal::Runtime_StringBuilderJoin(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node]
12: 0x3547db9dbe3d
[1] 28142 abort npm run build:next
๋น๋ํด์ผํฉ๋๋ค
ํด๋น๋๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ๋ฐ ๋์์ด๋๋ ์คํฌ๋ฆฐ ์ท์ ์ถ๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ์ญ์์ค.
๋ณต์ ์์ด ์ด๊ฒ์ ์ถ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ ์์. ์์ค ๋งต ์์ฑ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ป๊ธฐ ์ ์ ์ ๊ฑฐํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ดํฐ๋ธ ๋ฐฐ์ด ํ์ผ ์ฃผ์์์ด ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.
๋ ์์ธํ ์คํ ์ถ์ ์ ์ป์ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ฐธ๊ณ ๋ก ์ง๊ธ ๊ตฌ์ถ ์ค์ด์ง๋ง ๋ ธ๋ ํ๋ก์ธ์ค์ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
NODE_OPTIONS="--max_old_space_size=4096"
์ต๋ 28 ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ง๋ง 30 ๊ฐ์ ๊ฒฝ๋ก (31 ๊ฐ์ ๊ฒฝ๋ก๊ฐ ์์)๋ฅผ ์ ๊ณตํ๋ฉด ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ต๋ 3GB์ ๋ฉ๋ชจ๋ฆฌ (๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์)๊น์ง ๋์ด๋ฉ๋๋ค. 8GB์ ๋ฉ๋ชจ๋ฆฌ๊ฐ์๋ ํ๊ท ๋ ธํธ๋ถ์์ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ ์์ผ๋ฉฐ ์ผ๋ถ๋ ์ด๋ฏธ ์ฌ์ฉ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ด๋ฆฌํ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ๊ณต๊ฐํด์ผํ๋์ง ์ฌ๋ถ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋์์ด๋๋ค๋ฉด ๋น๋ ๋ ํ์ด์ง์ ํต๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ก์ธ์ค๋ ์์ค ๋งต์ ๋ง๋ค๋ ค๊ณ ํ ๋ ์ถฉ๋ํฉ๋๋ค (๋๋ถ๋ถ).
์ฐ๋ฆฌ๊ฐ ์ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์์ ํ ๋ณต์ ๊ฐ ์ ๊ณต๋๋์ง ์ฌ๋ถ์ ๋๋ค. ์ง๊ธ์ ๋ซ๊ฒ ์ต๋๋ค.
Next 9๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฐ๋ฉด Next 8์์๋ ๋ฌธ์ ๊ฐ๋์ง ์๋๋ค๋ ์ฌ์ค๋ ํ์ธํ์ต๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ CI ํ๋ฆ์ ์ผ๋ถ๋ก CircleCi์์ ์ฑ์ ๋น๋ํ๊ณ ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
Exited with code 137
Hint: Exit code 137 typically means the process is killed because it was running out of memory
Hint: Check if you can optimize the memory usage in your app
Hint: Max memory usage of this container is 4284268544
according to /sys/fs/cgroup/memory/memory.max_usage_in_bytes
4GB๋ CircleCI ์ปจํ ์ด๋์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ด๋ฏ๋ก ์ค๋ฅ์ ๋๋ค. Next 9๋ก ๊ฑด๋ฌผ์ ์ง๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ํ๊ณ์ ๋๋ฌํ๊ณ ์์ต๋๋ค.
ํ์ฌ ๊ณต์ ํ ์ฌํ ๊ฐ๋ฅํ ์ผ์ด์ค๊ฐ ์์ต๋๋ค.
NextJs 9๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋์์๋์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
NextJs 9๋ก ์ ๊ทธ๋ ์ด๋ ํ 3 ๊ฐ์ ํ๋ก์ ํธ ์ค 2 ๊ฐ๋ Elastic Beanstalk์ ๋ฐฐํฌ ํ ๋ ๋จ ์ฌ์ฉ ๋ฌธ์ ์ ์ง๋ฉดํฉ๋๋ค. ๊ฒฐ๊ตญ ๋๋๋ ค ์ผํฉ๋๋ค. ๋ถํํ๋ ๋๋ ๋ฌธ์ ๋ฅผ ๋ณต์ ํ๊ธฐ ์ํด ๊ณต์ ํ ์ ์ฅ์๊ฐ ์์ต๋๋ค.
๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ๋ชจ๋ ๋๋ค๊ฐ ๋น๋ ๋ ํ์ ๋ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฉํฑ์์ ๋น๋๋ฅผ ์๋ฃ ํ ์ ์์ง๋ง ๋ฐฐํฌ ํ ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง๋ง ๋ก์ปฌ์์ ๊ฐ๋ฐํ๋ ๋์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๊ฐ ๋ช ๊ฐ์ง ๋ฐ์ํ์ต๋๋ค. (๋์๊ฒ) ์์๋ณผ ์์๋ ์ ์ผํ ๊ฒ์ ๋ค์ ์ค์ ๋๋ค.
readFile [/tmp/b0cc21aa63cece4e/.build-utils/.builder/node_modules/@now/next/dist/index.js:9555]
์ฌ๊ธฐ์ ๋ก๊ทธ๊ฐ ์์ต๋๋ค ...
Aug 22 2019 01:26:51:346 | ฮป (Lambda) page was emitted as a lambda (i.e. getInitialProps)
-- | --
Aug 22 2019 01:26:51:346 | โก (Static File) page was prerendered as static HTML
Aug 22 2019 01:26:51:434 | Done in 146.48s.
Aug 22 2019 01:26:51:444 | preparing lambda files...
Aug 22 2019 01:34:22:983 | <--- Last few GCs --->
Aug 22 2019 01:34:22:983 | [430:0x23f5310] 666594 ms: Mark-sweep 4089.3 (4262.1) -> 4089.3 (4261.1) MB, 3898.4 / 0.0 ms allocation failure GC in old space requested
Aug 22 2019 01:34:22:983 | [430:0x23f5310] 671097 ms: Mark-sweep 4089.3 (4261.1) -> 4089.3 (4225.6) MB, 4502.8 / 0.0 ms last resort GC in old space requested
Aug 22 2019 01:34:22:983 | [430:0x23f5310] 674990 ms: Mark-sweep 4089.3 (4225.6) -> 4089.3 (4223.1) MB, 3892.4 / 0.0 ms last resort GC in old space requested
Aug 22 2019 01:34:22:983 | <--- JS stacktrace --->
Aug 22 2019 01:34:22:983 | ==== JS stack trace =========================================
Aug 22 2019 01:34:22:983 | Security context: 0x70e9f6257c1 <JSObject>
Aug 22 2019 01:34:22:983 | 1: toString [buffer.js:611] [bytecode=0x2833662c6061 offset=31](this=0xce2ca70dbc1 <Uint8Array map = 0x6cc06836709>,encoding=0x2fb750b822d1 <undefined>,start=0x2fb750b822d1 <undefined>,end=0x2fb750b822d1 <undefined>)
Aug 22 2019 01:34:22:983 | 2: arguments adaptor frame: 0->3
Aug 22 2019 01:34:22:983 | 3: readFile [/tmp/b0cc21aa63cece4e/.build-utils/.builder/node_modules/@now/next/dist/index.js:9555] [bytecode=0x1814135ff3e1 offset=53](t...
Aug 22 2019 01:34:22:983 | FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
Aug 22 2019 01:34:22:983 | 1:
Aug 22 2019 01:34:22:984 | node::Abort() [/node8/bin/node]
Aug 22 2019 01:34:22:984 | 2:
Aug 22 2019 01:34:22:986 | 0x11e73ec [/node8/bin/node]
Aug 22 2019 01:34:22:986 | 3:
Aug 22 2019 01:34:22:986 | v8::Utils::ReportOOMFailure(char const*, bool) [/node8/bin/node]
Aug 22 2019 01:34:22:986 | 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/node8/bin/node]
Aug 22 2019 01:34:22:986 | 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/node8/bin/node]
Aug 22 2019 01:34:22:986 | 6:
Aug 22 2019 01:34:22:986 | v8::internal::Factory::NewStringFromUtf8(v8::internal::Vector<char const>, v8::internal::PretenureFlag) [/node8/bin/node]
Aug 22 2019 01:34:22:986 | 7:
Aug 22 2019 01:34:22:987 | v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::NewStringType, int) [/node8/bin/node]
Aug 22 2019 01:34:22:987 | 8:
Aug 22 2019 01:34:22:987 | node::StringBytes::Encode(v8::Isolate*, char const*, unsigned long, node::encoding, v8::Local<v8::Value>*) [/node8/bin/node]
Aug 22 2019 01:34:22:987 | 9:
Aug 22 2019 01:34:22:988 | 0x12070d6 [/node8/bin/node]
Aug 22 2019 01:34:22:988 | 10:
Aug 22 2019 01:34:22:988 | v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&)) [/node8/bin/node]
Aug 22 2019 01:34:22:988 | 11:
Aug 22 2019 01:34:22:989 | 0xb79dac [/node8/bin/node]
Aug 22 2019 01:34:22:989 | 12:
Aug 22 2019 01:34:22:989 | v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*) [/node8/bin/node]
Aug 22 2019 01:34:22:989 | 13: 0x47a70c842fd
Aug 22 2019 01:35:32:549 | done
๋ด webpack ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const loadConfig = require('./loadConfig');
const reNodeModules = /node_modules/;
const reScript = /\.(js|jsx|mjs)$/;
const reImage = /\.(bmp|gif|jpg|jpeg|png|svg)$/;
const reGraphql = /\.graphql?$/;
const reStyle = /\.(css|less|styl|scss|sass|sss)$/;
module.exports = (nextConfig = {}) => {
return {
...nextConfig,
webpack(config, options) {
const { webpack, isServer, dev } = options;
const staticAssetName = dev ? '[path][name].[ext]?[hash:8]' : '[name]-[hash:8].[ext]';
const publicPath = '/_next/static/';
const outputPath = `${isServer ? '../' : ''}static/`;
// eslint-disable-next-line no-param-reassign
config.resolve = {
...config.resolve,
modules: [...config.resolve.modules, './src'],
};
config.module.rules.push(
{
test: reImage,
exclude: reNodeModules,
oneOf: [
// Inline lightweight into CSS
{
issuer: reStyle,
oneOf: [
// Inline lightweight SVGs as UTF-8 encoded DataUrl string
{
test: /\.svg$/,
loader: 'svg-url-loader',
options: {
name: staticAssetName,
limit: 4096, // 4kb
publicPath,
outputPath,
},
},
// Inline lightweight as Base64 encoded DataUrl string
{
loader: 'url-loader',
options: {
name: staticAssetName,
limit: 4096, // 4kb
publicPath,
outputPath,
},
},
],
},
// Or return public URL to image resource
{
loader: 'file-loader',
options: {
name: staticAssetName,
publicPath,
outputPath,
},
},
],
}, // Rules for GraphQL
{
test: reGraphql,
exclude: reNodeModules,
use: [
{
loader: 'webpack-graphql-loader',
options: {
removeUnusedFragments: true,
output: 'document',
},
},
],
},
{
exclude: [reNodeModules, reScript, reImage, reGraphql, /\.json$/, /\.txt$/, /\.md$/],
loader: 'file-loader',
options: {
name: staticAssetName,
publicPath,
outputPath,
},
},
);
const appConfig = loadConfig();
if (isServer && dev) {
console.info(appConfig);
}
config.plugins.push(
new webpack.DefinePlugin({
__DEV__: dev,
__SERVER__: isServer,
__BROWSER__: !isServer,
__CONFIG__: JSON.stringify(appConfig),
}),
);
if (typeof nextConfig.webpack === 'function') {
return nextConfig.webpack(config, options);
}
return config;
},
};
};
@timneutkens Next.js 9๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผํ๋ ๊ตฌ์ฑ ์์์ ์ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ์์ ํ ์ฌํ์ด ํ์ํ๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ๋ด ์ง์ ์ ๋ณผ ์ ์์ต๋๋ค.
https://github.com/stramel/styled-icons/tree/ms/add-material-variants
์คํจํ ๋น๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://travis-ci.org/jacobwgillespie/styled-icons/builds/582987078
Travis๋ NODE_OPTIONS=--max-old-space-size=4096
์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
@timneutkens ๋ ์ด์ repo๊ฐ โโ์์ผ๋ฏ๋ก ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์์ต๋๊น?
[email protected] ์ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ
์ด ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋จ์ํ ํฌ๊ธฐ ๋ฒ์์ ๋๋ฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ์์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. NODE_OPTIONS=--max-old-space-size=4096
๋ฅผ ํตํด ์ถ๊ฐ๋ก ๋น๋๋ฅผ ์คํํด์ผํฉ๋๋ค.
๋๋ ์๋ก์ด ์ฒญํน ๊ธฐ๋ฅ์ ํ์ฑํ ํ ์ ์์ต๋๋ค.
// next.config.js
module.exports = {
experimental: { granularChunks: true }
}
@Timer ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. granularChunks
๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
๋ํ ๋ด ๋ก์ปฌ ์ปดํจํฐ์ ๊ฐ์ผ๋ก 8192๋ฅผ ์๋ํ์ง๋ง ์ฌ์ ํ ์คํจํ์ต๋๋ค. ์ค์ ๋ก ๊ตฌ์ถํ๋ ๋ฐ ์ผ๋ง๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ์ง ์์ํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ฌด์์์.
๋๋ ์ค๋๋ ๋ฌธ์ ๋ฅผ ์ดํด ๋ณด์๊ณ ๋๋ก๋ ์๋ก์ด ์ฃผ์ ๋ฆด๋ฆฌ์ค๊ฐ์์ ๋ ์ผ๋ถ ์ฌ๋๋ค ์ด์ด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ์ ์ง๋ฉดํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ํฐ ํ๋ก์ ํธ์์ ๊ธฐ์ต๋ ฅ ํ ์คํธ๋ฅผ ํ์๋์?
์ด ์๋ก์ด ์ฃผ์ ๋ฆด๋ฆฌ์ค๋ ๋ ธ๋ ๋ฉ๋ชจ๋ฆฌ ์บก์ ๋๋ฌํ์ต๋๋ค. ์ด์ ์ ์์๋ ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ธ์ ๋ฌด์์ผ๊น์?
@Timer granularChunks
๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ณด์์ง๋ง ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. 8192 ์ธํธ๋ก ๋ก์ปฌ์์๋.
์ฌ๊ธฐ์๋ ์ธ๋ถํ ๋ ์ฒญํฌ ๊ตฌ์ฑ ๊ธฐ๋ฅ ์ธํธ https://github.com/stramel/styled-icons/tree/ms/granular-chunks๊ฐ ์์ต๋๋ค.
๊ตฌ์ฑ ์์๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ์ผ๋ก ์ ํ๋์์ต๋๋ค. https://github.com/stramel/styled-icons/tree/ms/dynamic-import-granular-chunks
์ด ๋ฌธ์ ๋ ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด์๋ ์ถ์๋ฅผ ์ํํ๋๋ก ๋น๋๋ฅผ ๋ณ๊ฒฝํ ๋ ์ ์ฅ์ ์ค ํ๋์์ ๋ฐ์ํฉ๋๋ค.
์
๋ฐ์ดํธ : ์ฝ๋๋ฒ ์ด์ค์์ ๋ฌธ์ ๊ฐ withSourceMaps
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ณ ์์์ ํ์ธํ์ต๋๋ค.
"@zeit/next-source-maps": "^0.0.4-canary.1"
์ด๊ฒ์ ๋งค์ฐ ๋๋ฆฐ hidden-source-map
์ค์ ํ๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํ์ง๋ง NextJS 8๋ณด๋ค ์ ๊ธฐํ ๊ธ์์ ์ผ๋ก ๋๋ฆฐ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ v9๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ ์์ฒญ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค ... ์ ๋ 2015 ๋ ๋งฅ๋ถ ํ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด์ ์๋ ์ง์ฐ๋ ์ ์ด ์์ผ๋ฉฐ ๊ฝค ๋ฌด๊ฑฐ์ด ํ๋ก๊ทธ๋จ์ ์คํํ์ง๋ง ์ด์ ๋ ๋ค์ ์ฑ์ ๋ก์ปฌ์์ ์คํํ ๋๋ง๋ค ๊ทธ๊ฒ์ ์์ ํ ์ง์ฐ๋๊ณ ๋ชจ๋ ๊ฒ์ด ์์ฒญ๋๊ฒ ๋๋ ค์ง๋๋ค.
์ ๋ ๋ณดํต 10 ๋ถ ์ ๋๋ง๋ค ์ฑ์ ๋ค์ ์์ํด์ผํฉ๋๋ค. ์ค๋์ ์ธ๋ดํ๊ณ ํด๊ฒฐํ๋ ค๊ณ ๋
ธ๋ ฅํ ์ฒซ ๋ ์ด์๊ณ , dev move์์ ๋ช ์๊ฐ์ ์คํ ํ ํ ๋์ผํ JavaScript heap out of memory
๋ฅผ ๋ฐ์์ต๋๋ค. ๋ค์ ๋น๋ ์คํ์ ๋ํด๋ณด๊ณ ํ์ต๋๋ค. ์ฌ๊ธฐ ์ด๋๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ์์๊ฑฐ์ผ
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํด. ๋ด ๋๋ฃ๋ ๋ ์ต๊ทผ์ MacBook์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ค์ 9๋ก ์ ๊ทธ๋ ์ด๋ ํ ์ดํ๋ก ๊ฐ๋ฐ ์๋ฒ๋ ์ฌ ์ปดํ์ผ ์๋๊ฐ ๋๋ ค์ก์ต๋๋ค. ๋๋ก๋ 20 ์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ 32GB ์ค์ ๋ฉ๋ชจ๋ฆฌ MacBook Pro์์ NODE_OPTIONS = 16384๋ฅผ ์๋ํ์ง๋ง ํจ๊ณผ๊ฐ ์์ต๋๋ค.
๋ก๊ทธ๊ฐ ๋์ด๋ฉ๋๋ค.
==== JS stack trace =========================================
0: ExitFrame [pc: 0x335bafb5be3d]
Security context: 0x0fe28be1e6e9 <JSObject>
1: createPrinter [0xfe25fe2c0b9] [/Users/my-name/my-project/node_modules/typescript/lib/typescript.js:~86713] [pc=0x335bb12e86f3](this=0x0fe280c03329 <Object map = 0xfe2df152cc9>,printerOptions=0x0fe2f39e8ae1 <Object map = 0xfe20ac205a9>,handlers=0x0fe28e1026f1 <undefined>)
2: arguments adaptor frame: 1->2
3: reportImplicitAny(aka reportImpli...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 0x10003d035 node::Abort() [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
2: 0x10003d23f node::OnFatalError(char const*, char const*) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
3: 0x1001b8e15 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
4: 0x100586d72 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
5: 0x100589845 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
6: 0x1005856ef v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
7: 0x1005838c4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
8: 0x10059015c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
9: 0x1005901df v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
10: 0x10055fb24 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
11: 0x1007e7e04 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/opt/nvm/versions/node/v10.16.3/bin/node]
12: 0x335bafb5be3d
13: 0x335bb12e86f3
14: 0x335bafb0a5c3
@timneutkens ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด๊ฑฐ ๋ ์ ๋ฌธ์ ๋ฅผ ์ฝ๋ ๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ด์ํ ๋ฌดํ HMR ์์ฒญ์ผ๋ก ์ธํด ๊ฐ๋ฐ ๋ชจ๋์์ ์ฑ์ ์ฌ์ฉํ ์ ์๊ฒ๋๊ณ ์์ฒญ๋ ์๊ฐ์ด ์๋ชจ๋ฉ๋๋ค.
๋ค๋ฅธ ์ฆ์ธ ์ถ๊ฐ.
Next ๋ฒ์ 4.2.3์ผ๋ก ์ฑ์ ์์ํ์ต๋๋ค.
ํ๋ก์ ํธ์ ๋ก์ปฌ ์๋น์ค๋ฅผ ์ํํ์ ๋ ๋ค์ ์ค๋ฅ๋ก ์ธํด ์คํจํ์ต๋๋ค.
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
์คํจ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ์ ์์ํ ํ 10 ๋ถ ์ด๋ด์ ๋ฐ์ํ๋ฉฐ ์ฑ์์ ๋ ๋ง์ ํ์์ ํธ๋ฆฌ๊ฑฐํ์ฌ ์๋๋ฌ ์ง ์ ์์ต๋๋ค.
๋ฒ์ 8.1.0์ผ๋ก ๋ ๋๋ ธ๊ณ ๋ ์ง์งํ ํ์ (๋ฐ๋ผ์ ํ์ด์ง ๋น๋)์ผ๋ก๋ ๋์ผํ ์คํจ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค.
๋ค, ์ฐ๋ฆฌ๋ ์ด๊ฑธ๋ณด๊ณ ์์ต๋๋ค ...
๋ค์ ์ด ์๊ฐ์ ๋๋ค @timneutkens
์ด์ ๊ฐ๋ฐ ๋ชจ๋์์ bootstrap.min.css๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ ์์ํ ์ดํ๋ก react-router ์ฌ์ฉ์ ์ ์ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ [email protected]์์๋์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.
js๋ฅผ ํตํด require / import ๋๋ css / scss๋ฅผ ํตํด @import ๋ฅผ ์ฌ์ฉํ์ฌ bootstrap.min.css๋ฅผ ์ง์ ๊ฐ์ ธ์ฌ ๋ ๋ ๋ค. ๋ด nodejs ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๊ฐ๋ฐ ์ค์ ๋ช ๊ฐ์ง ์ค์ ํ ์ฆ๊ฐํ์ต๋๋ค.
ํ์ง๋ง cdn์์ ๋ถํธ ์คํธ๋ฉ์ ๊ฐ์ ธ์ฌ ๋ ์
๋ค์ / ๋จธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ ๊ฐ๋ฐ ์๊ฐ์ ๋ง์ ์ฌ๋๋ค์ด ์ค์ํ ํ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค.<Head>
<meta key="viewport" name="viewport" content="initial-scale=1.0, width=device-width" />
<link key="bootstrapcdn" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" ... />
...
</Head>
๊ทธ๋์ ๋ฌธ์ ๋ next-css์ CSS ์ถ์์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ํ๋ก์ ํธ๋ฅผ 8.1.0์ผ๋ก ๋ค์ด ๊ทธ๋ ์ด๋ ํ ๋์ด ์ถ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. https://github.com/zeit/next-plugins/issues/541. ๊ทธ๋์์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ํ์ต๋๋ค (https://github.com/zeit/next-plugins/issues/392#issuecomment-475845330). ์์ง ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์
// next.config.js
const withCSS = require('@zeit/next-css');
function HACK_removeMinimizeOptionFromCssLoaders(config) {
console.warn(
'HACK: Removing 'minimize' option from 'css-loader' entries in Webpack config',
);
config.module.rules.forEach(rule => {
if (Array.isArray(rule.use)) {
rule.use.forEach(u => {
if (u.loader === 'css-loader' && u.options) {
delete u.options.minimize;
}
});
}
});
}
module.exports = withCSS({
webpack(config) {
HACK_removeMinimizeOptionFromCssLoaders(config);
return config;
},
});
Next 9.1.3์ผ๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๋ next-css๋ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์๋ง๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๊ทธ๊ฒ์ ์ถฉ๋์ํค๋ ๊ฒ์ผ๊น ์?
์ด๊ฒ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ๋์ผํ ์ง ํ์คํ์ง ์์ง๋ง ์์ฒญํ๋ ๋ฆฌ์์ค๋ฅผ ์ค์ ๋ก ์ฐพ์ ์ ์๋์ง ํ์ธํ์ญ์์ค. ์ฑ์์ ์ฐพ์ ์์๋ ์ด๋ฏธ์ง๊ฐ ์์๊ณ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋๊น์ง ๊ณ์ ๊ฒ์ํ์ต๋๋ค. ๋๋ ๊ทธ ์ด๋ฏธ์ง์ ๋ํ ์ธ๊ธ์ ์ ๊ฑฐํ๊ณ ๊ทธ๊ฒ์ ๋์๊ฒ ๋ค์ ์ค๋ฅ๋ฅผ์ฃผ์ง ์์๋ค.
๋๋ ๋ํ ์ด๊ฒ์ ๊ณ ์น ์ ์์๊ณ @lloan ์ฝ๋ฉํธ๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊ทธํ๋ ๋ฐ ๋์์ด๋์์ต๋๋ค.
๋ด ๊ฒฝ์ฐ, ๋๋ ์ฐธ์กฐ ๋ /public/manifest.json
A์ meta
ํ๊ทธ <head/>
์์ ๋ด ํ๋ก์ ํธ์ ์กด์ฌํ์ง ์์๋ค ๊ทธ๋ฌ๋ ๊ฒ์,์ด ๋ฉ๋ชจ๋ฆฌ ๋์์ ์์ธ์ด๋์๋ค.
icon.png
์ด ์กด์ฌํ์ง ์๋์ด ์ฝ๋๊ฐ ์์ต๋๋ค.
<Head>
<link rel="icon" href="/static/icon.png" type="image/png" />
</Head>
ํ๋น์ฝ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์์ ํ๋ฉด ๋ ์ด์ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
<Head>
<link rel="icon" href="/icon.png" type="image/png" />
</Head>
์ธ๊ธํ๋ฏ์ด https://github.com/zeit/now/issues/3307 static
/ public
ํด๋์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋์ด ๋ฌธ์ ๊ฐ ์์๋ค. bukinoshita๊ฐ ์ธ๊ธํ๋ฏ์ด ์ ์ ํด๋๋ฅผ ์กฐ์ฌํ์ต๋๋ค. public/static/
ํด๋์์ 674 ๊ฐ์ json ํ์ผ (ํ
์คํธ ์ฉ) ํด๋๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ๋๋ ๊ทธ ์ดํ๋ก ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด์๋ ์ถ์๋ฅผ ์ํํ๋๋ก ๋น๋๋ฅผ ๋ณ๊ฒฝํ ๋ ์ ์ฅ์ ์ค ํ๋์์ ๋ฐ์ํฉ๋๋ค.
์ ๋ฐ์ดํธ : ์ฝ๋๋ฒ ์ด์ค์์ ๋ฌธ์ ๊ฐ
withSourceMaps
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ณ ์์์ ํ์ธํ์ต๋๋ค.
"@zeit/next-source-maps": "^0.0.4-canary.1"
์ด๊ฒ์ ๋งค์ฐ ๋๋ฆฐ
hidden-source-map
์ค์ ํ๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํ์ง๋ง NextJS 8๋ณด๋ค ์ ๊ธฐํ ๊ธ์์ ์ผ๋ก ๋๋ฆฐ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
"@zeit/next-source-maps": "^0.0.4-canary.1"
์
๊ทธ๋ ์ด๋ ํ ํ์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ด๋ค ํด๊ฒฐ์ฑ
์ด๋ ์์ค ๋งต์ ์ ๊ฑฐํด์ผํฉ๋๊น?
@focux ๋๋ ์์ค ๋งต์ ์ ํ ๋นํ์ฑํํด์ผํ์ต๋๋ค. ๊ทธ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฌ๊ฒ ๊ฐ์ํ์ต๋๋ค.
์ฌ๊ธฐ์์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋น๋์ ํ์ผ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ์ถฉ๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, Typescript์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ์ ธ ์๊ณ ๋น๋์ ํ์ผ ํฌ๊ธฐ๊ฐ 2.41MB๊น์ง ์ฆ๊ฐํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ 2GB ๋จ์ด์๋ CI๊ฐ ์ถฉ๋ํ๊ธฐ ์์ํ์ต๋๋ค. Typescript ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ ๊ฑฐํ ํ ํ์ผ ํฌ๊ธฐ๊ฐ 100kb๋ก ์ค์ด๋ค์๊ณ ๋ค์ ์๋ํ์ต๋๋ค.
Nextjs 9๋ ์ฒ์๋ถํฐ CI์์ ๋งค์ฐ ๋ ๋ ธ์ต๋๋ค. ๋น๋ํ๋ ๋ฐ ์๊ฐ์ด ๋งค์ฐ ์ค๋ ๊ฑธ๋ฆฌ๊ณ ํน๋ณํ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. ๋ฐ์ํ๋ ๊ฒ, ์ฌ๋ฃ UI, ์ฌ๊ธฐ์ ๊ธฐ์ ์ผ๋ถ ํจํค์ง. ๋๋ ๋ ธ๋ / ์ต์คํ๋ ์ค, ์ผ๋ถ dotnet ์ฝ์ด, php ๋ฑ์ด์๋ ๋์ผํ ํด๋ฌ์คํฐ์ CI๊ฐ ์์ต๋๋ค.์ด ๋ชจ๋ ๊ฒ๋ค์ CI์ 1GB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋น๋๋ฉ๋๋ค. ๋น๋ ํ๋ก์ธ์ค์ ๋ํ ๋ด ๋๋๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ์์ง ๋ชปํฉ๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Mac OS / Github ์์ . ์ฌ๊ธฐ์ ์ธ๊ธ ๋ ์์ ์ ๋์์ด๋์ง ์์ผ๋ฉฐ ๋งํฌ๋์์ง๋ง ์กด์ฌํ์ง ์๋ ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ๋ก์ ํธ๋ Zeit Now์์ ๋น๋ (์์ฐ ์ค)๋ฉ๋๋ค.
๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด ๋๊ณ ์ถ์ต๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค (MacOS). ๋ด๊ฐ ์ฐพ์ ๊ฒ์ :
๋์์ด ํ์ํ๋ฉด ์๋ ค์ฃผ์ธ์. ์ฌ๊ธฐ์ ์ค๋ฅ ๋ก๊ทธ๊ฐ ์์ต๋๋ค ...
<--- Last few GCs --->
[83442:0x102804000] 123060 ms: Scavenge 1371.3 (1422.4) -> 1370.7 (1422.9) MB, 8.3 / 0.0 ms (average mu = 0.120, current mu = 0.058) allocation failure
[83442:0x102804000] 123066 ms: Scavenge 1371.7 (1422.9) -> 1370.9 (1423.9) MB, 4.1 / 0.0 ms (average mu = 0.120, current mu = 0.058) allocation failure
[83442:0x102804000] 123071 ms: Scavenge 1371.7 (1423.9) -> 1371.0 (1424.4) MB, 3.9 / 0.0 ms (average mu = 0.120, current mu = 0.058) allocation failure
<--- JS stacktrace --->
==== JS stack trace =========================================
0: ExitFrame [pc: 0x3b944125be3d]
Security context: 0x164494d1e6e9 <JSObject>
1: SourceMapConsumer_allGeneratedPositionsFor [0x16448b97d331] [/Users/alberto.iglesias/Coding/iteisa/projects/ceoe-gis/node_modules/@babel/core/node_modules/source-map/lib/source-map-consumer.js:~178] [pc=0x3b944240968c](this=0x1644193fb679 <BasicSourceMapConsumer map = 0x16448ea8a239>,aArgs=0x16447d082249 <Object map = 0x16448ea98939>)
2: /* anonym...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 0x10003d035 node::Abort() [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
2: 0x10003d23f node::OnFatalError(char const*, char const*) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
3: 0x1001b8e15 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
4: 0x100586d72 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
5: 0x100589845 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
6: 0x1005856ef v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
7: 0x1005838c4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
8: 0x10059015c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
9: 0x1005901df v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
10: 0x10055fb24 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
11: 0x1007e7e04 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/alberto.iglesias/.nvm/versions/node/v10.16.3/bin/node]
12: 0x3b944125be3d
13: 0x3b944240968c
Abort trap: 6
SourceMapConsumer_allGeneratedPositionsFor
์ด๊ฒ์ด ๋ฒ์ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฐ ๋ชจ๋์์๋ ์์ค ๋งต์ด ์์ฑ๋ฉ๋๋ค. ์๊ฐ์ด ์ง๋๋ฉด์ด ์์ค ๋งต ํ๋ฌ๊ทธ์ธ์ด ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ค ๋งต ์์ฑ์ ๋๋๋ผ๋ ์ฌ์ ํ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ะกะตัะณะตะน.
2019 ๋ 12 ์ 24 ์ผ 10:01 GMT์ Emanuele [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
SourceMapConsumer_allGeneratedPositionsFor ์ด๊ฒ์ด ๋ฒ์ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฐ ๋ชจ๋์์๋ ์์ค ๋งต์ด ์์ฑ๋ฉ๋๋ค. ์๊ฐ์ด ์ง๋๋ฉด ์ด๋ฌํ ์์ค ๋งต ํ๋ฌ๊ทธ์ธ์ด ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub ์์ ํ์ธํ๊ฑฐ๋ ์์ ์ ๊ฑฐ๋ถ ํ์ธ์.
"์์ง๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค"๋ฅผ ๊ฒ์ํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด ์กฐ์ฌ ํ ์ ์๋๋ก ์์ ํ ์ฌํ์ ์ ๊ณตํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทํ์ ์๊ฒฌ์ ์ด๊ธฐ ๋ฌธ์ ์ ๋ํด ๐๋ฅผํ๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง ์ด์ ์์ด ๋ฌธ์ ์ ๋ชจ๋ ์ฌ๋์๊ฒ ํ์ ๋ณด๋ ๋๋ค.
๋๊ธ์ด ์คํ ๊ฐ๋ฅํ๊ฑฐ๋ ์ ์ฉํ ์ง ํญ์ ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด ematipico์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ์ฌ ๊ณต์ ํ๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค. "์์ง๋์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์ ์ฉํ์ง ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋ด CI / CD ํ์ดํ ๋ผ์ธ์ด 1GB RAM์์ ์คํจํฉ๋๋ค.
@timneutkens ์ฌํ ๋จ๊ณ๋์ด ๋ซํ ๋ฌธ์ ์์ ์ธ๊ธ ํ๋๋ก์ ๋๋ค.
https://github.com/zeit/next.js/issues/9442#issuecomment -554839437
๋๋ฅผ ์ํด ์ผํ @ Vista1nik ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ค์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๊ด๋ จ๋ ์ง๊ธ ๋ฌธ์ :
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ํ ๋ก ์ ์ถ๊ฐํ์ญ์์ค.
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๊ฒฝํ ํ ๋ค์ ๋ด ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์์ ๋์ต๋๋ค.
๋ค์ ์ฝ๋ ์กฐ๊ฐ์์ const Icon
๊ฐ undefined
๊ฒฝ์ฐ ์ฝ๋๋ ๊ตฌ์ฑ ์์๊ฐ ์ ํจํ์ง ํ์ธํ๋ ๋ฌดํ ๋ฃจํ์ ๋ค์ด๊ฐ๋๋ค.
const iconMapping = {
"flash-outline": FlashOutline,
};
export const Icon = ({ name }) => {
const Icon = iconMapping[name];
return <Icon />;
}
const Icon
๊ฐ ์ ์๋์ด ์์ง ์์ ๊ฒฝ์ฐ ํ์ธ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
...
const Icon = iconMapping[name];
if (!Icon) return null;
return <Icon />;
}
๋์๊ฒ๋ ๋๊ฐ์ ์ผ์ด ์ผ์ด ๋ฌ๊ณ ๊ทธ ์์ธ์ด ์คํ์์ ๊นจ๋ฌ์์ต๋๋ค.
const Button = ({ children }) => {
// BUG: the button should be lower case (the HTML input)
// instead of CamelCase (an undefined component)
return <Button>{children}</Button>
}
์ต์ ๋ฒ์ ์ Next.js๋ก ์ ๊ทธ๋ ์ด๋ ํด๋ณด์ธ์. ์ต๊ทผ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ์ต๋๋ค.
@timneutkens , ์ต์ ๋ฒ์ (9.3.5)์ด ์์ต๋๋ค. ์ค๋ ์์นจ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์๊ณ ๋ช ๋ถ ํ์ ๊ทธ ์ค๋ฅ์ ์ง๋ฉดํ์ต๋๋ค.
next-source-maps
์ฌ์ฉํ์ฌ ์์ค ๋งต์ผ๋ก ์ฑ์ ๋น๋ํ๋ ๋์ CricleCI์์ ์ ์ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
NODE_OPTIONS="--max_old_space_size=4096"
๋ก์ปฌ์์ ๋์์ด๋์์ง๋ง CircleCI์์๋ ๋ฆฌ์์ค ํด๋์ค https://circleci.com/docs/2.0/configuration-reference/#resource_class ๋ฅผ ์ต์ํ large
๋ก ๋๋ ค์ผ ์๋ํฉ๋๋ค. ์ ํํ.
์ค๋ ๋ค์ 9.3.6์ผ๋ก ์ ๋ฐ์ดํธ ํ ํ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค.
<--- Last few GCs --->
[66325:0x108008000] 17639 ms: Mark-sweep 1936.2 (2071.4) -> 1923.6 (2073.4) MB, 283.4 / 0.0 ms (average mu = 0.157, current mu = 0.048) allocation failure scavenge might not succeed
[66325:0x108008000] 17937 ms: Mark-sweep 1938.1 (2073.4) -> 1925.4 (2075.4) MB, 285.8 / 0.0 ms (average mu = 0.108, current mu = 0.042) allocation failure scavenge might not succeed
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 0x0fb9ac667d09 <JSObject>
0: builtin exit frame: stringify(this=0x0fb9ac6598a9 <Object map = 0xfb921b01449>,0x0fb958e804d1 <undefined>,0x0fb958e804d1 <undefined>,0x0fb910180ec1 <Object map = 0xfb9d8491399>,0x0fb9ac6598a9 <Object map = 0xfb921b01449>)
1: arguments adaptor frame: 1->3
2: callAsync [0xfb9320a6cf9] [0x0fb958e804d1 <undefined>:~1] [pc=0x1aa09fe84627](this=0x0fb9320a6909 <Hook map = 0xfb9d8495179>...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
...
# 12280์ ์ ์ ๋๋๋ก tsconfig.json
์์ paths
์ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์๋ง๋ ๋ค๋ฅธ ์์ธ
9.0.5์์ 9.3.6์ผ๋ก ์ ๊ทธ๋ ์ด๋ ํ ํ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์ ๋ํ๋ฉ๋๋ค.
Creating an optimized production build ..
<--- Last few GCs --->
[1600:0000020DB9FFEBE0] 26245 ms: Mark-sweep 1958.0 (2080.3) -> 1945.0 (2081.5) MB, 266.4 / 0.0 ms (average mu = 0.179, current mu = 0.077) allocation failure scavenge might not succeed
[1600:0000020DB9FFEBE0] 26530 ms: Mark-sweep 1959.9 (2082.0) -> 1947.2 (2083.8) MB, 265.9 / 0.0 ms (average mu = 0.127, current mu = 0.068) allocation failure scavenge might not succeed
<--- JS stacktrace --->
==== JS stack trace =========================================
0: ExitFrame [pc: 00007FF77B4D4DDD]
Security context: 0x00e7d00c08d1 <JSObject>
1: /* anonymous */(aka /* anonymous */) [000002BB3E5CAA29] [C:\Users\...\node_modules\enhanced-resolve\lib\UnsafeCachePlugin.js:~27] [pc=00000147695447FC](this=0x00d9404004b1 <undefined>,0x001a9e083681 <Object map = 000003D51551D3A9>,0x001a9e0838d9 <Object map = 000003D515521AE9>,0x001a9e083979 ...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 00007FF77A8D363F napi_wrap+128063
2: 00007FF77A872836 v8::base::CPU::has_sse+35142
3: 00007FF77A8734F6 v8::base::CPU::has_sse+38406
4: 00007FF77B089F4E v8::Isolate::ReportExternalAllocationLimitReached+94
5: 00007FF77B072021 v8::SharedArrayBuffer::Externalize+833
6: 00007FF77AF3E57C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1436
7: 00007FF77AF497D0 v8::internal::Heap::ProtectUnprotectedMemoryChunks+1312
8: 00007FF77AF462F4 v8::internal::Heap::PageFlagsAreConsistent+3204
9: 00007FF77AF3BB13 v8::internal::Heap::CollectGarbage+1283
10: 00007FF77AF3A184 v8::internal::Heap::AddRetainedMap+2452
11: 00007FF77AF5C734 v8::internal::Factory::NewInternalizedStringImpl+132
12: 00007FF77AD9C7FD v8::internal::DescriptorArray::Allocate+4941
13: 00007FF77ADAD0C5 v8::internal::StringTable::LookupString+373
14: 00007FF77AAAF356 v8::internal::Factory::InternalizeName+54
15: 00007FF77ACAB0BE v8::internal::Runtime::GetObjectProperty+9662
16: 00007FF77B4D4DDD v8::internal::SetupIsolateDelegate::SetupHeap+546637
17: 00000147695447FC
์ด๋ค ์๊ฐ?
@szaza ๋ next@canary
๋ฅผ ์๋ํด ๋ณผ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒฝ์ฐ๋ ์ฌ๊ธฐ์ ์ค๋ช
๋ ๋ฌธ์ ๊ฐ์๋ ๊ฒ์
๋๋ค. https://github.com/zeit/next.js/issues/12280
์ข์์, node_modules
์ ์ญ์ ํ๊ณ ์ข
์์ฑ์ ๋ค์ ์ค์นํ๋ฉด ์นด๋๋ฆฌ์ ๋ฒ์ ์์ ์๋ํ๋ ๊ฒ ๊ฐ์ง๋ง ์ด์ Cannot find module 'next-server/dist/server/next-server'.
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ต์ํ ๊ฒ ๊ฐ์ต๋๊น?
์๊ฒ ์ต๋๋ค. import Server from "next/dist/next-server/server/next-server";
๋ก ์ด๋ํ์ต๋๋ค.
์ด์ ์ ์๋ํฉ๋๋ค. ๋น์ ์ ๋์์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
@szaza ํ๋ก์ ํธ์์ ํด๋น ๋ชจ๋์ ์ด๋ป๊ฒ ๊ฐ์ ธ ์์ต๋๊น? ๋ด๋ถ ๋ชจ๋์ธ๊ฐ์? ๋์ 'next'
๋ฅผ ๊ฐ์ ธ ์ค๋ ค๊ณ ํ์
จ๋์?
TypeScript๋ก ์์ฑ๋ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ฅผ ์งํ ์ค์ ๋๋ค. ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ค์ ๋ฆฌ๋๋ ์ ํ๋ ์ฌ๊ถ ์ธ์ฆ ๋ฏธ๋ค์จ์ด๊ฐ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
import Server from "next-server/dist/server/next-server";
...
export const initPassport = (
server: Express,
app: Server,
authStrategies: string[]
) => {
...
return app.render(req, res, AuthRoutes.LOGIN_PAGE);
...
}
๋ค์ ๋ฒ์ ์ 9.0.5์์ 9.3.7-canary.0์ผ๋ก ์
๋ฐ์ดํธ ํ ํ Server
์ ํ์ ๋ ์ด์ next-server/dist/...
์์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ์์์ ์ธ๊ธ ํ ๊ฒฝ๋ก์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ด package.json์ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ทธ๋ ์ด๋ ํ ๋ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ์ฌ ์ ๋ ๋ฌธ์ ์์ด @ zeit / next-css ์ ํจ๊ป NextJS 9.2.2 ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ผ๋ถ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ฑฐ๋ ์ด๋ป๊ฒ ๋ NextJS์ ์ถฉ๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ด ํ์ฌ ํจํค์ง ๊ตฌ์ฑ์-
{
"dependencies": {
"@zeit/next-css": "^1.0.1",
"axios": "^0.19.2",
"body-parser": "^1.19.0",
"compression": "^1.7.4",
"cookie-parser": "^1.4.4",
"cookie-session": "^1.4.0",
"express": "^4.17.1",
"helmet": "^3.21.3",
"json-server": "^0.16.1",
"morgan": "^1.9.1",
"next": "^9.2.2",
"passport": "^0.4.1",
"passport-local": "^1.0.0",
"passport-strategy": "^1.0.0",
"prop-types": "^15.7.2",
"react": "^16.13.0",
"react-dom": "^16.13.0",
"react-mathjax2": "0.0.2",
"shaka-player": "^2.5.10",
"styled-components": "^5.0.1"
},
"devDependencies": {
"@babel/cli": "^7.8.4",
"@babel/core": "^7.9.0",
"@babel/preset-env": "^7.8.6",
"@babel/preset-react": "^7.8.3",
"babel-jest": "^25.1.0",
"babel-plugin-module-resolver": "^4.0.0",
"babel-plugin-styled-components": "^1.10.7",
"enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.2",
"jest": "^25.1.0",
"react-test-renderer": "^16.13.0"
}
}
๋ด ํน์ ๋ฌธ์ ๋ฅผ https://github.com/google/schema-dts ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ผ๋ก ์ขํ์ต๋๋ค
pages/
์์ ํ ํ์ด์ง๋ฅผ ์ ์ธํ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ ๊ฑฐํ๊ณ ํ๋ก์ ํธ๊ฐ ๋น๋ ๋ ๋๊น์ง ์ฝ๋๋ฅผ ์ ๊ฑฐํ ๋ค์ ์ ์ฐจ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ค์ ์ฝ์
ํ์ฌ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น
ํ์ต๋๋ค.
์๋ง๋ ์ด๊ฒ์์ด ์ค๋ ๋๋ฅผ ๋ฐ๊ฒฌํ๋ ์ฌ๋์๊ฒ ๋์์ด ๋ ๊ฒ์ ๋๋ค ๐คทโโ๏ธ
next-source-maps
์ฌ์ฉํ์ฌ ์์ค ๋งต์ผ๋ก ์ฑ์ ๋น๋ํ๋ ๋์ CricleCI์์ ์ ์ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
NODE_OPTIONS="--max_old_space_size=4096"
๋ก์ปฌ์์ ๋์์ด๋์์ง๋ง CircleCI์์๋ ๋ฆฌ์์ค ํด๋์ค https://circleci.com/docs/2.0/configuration-reference/#resource_class ๋ฅผ ์ต์ํlarge
๋ก ๋๋ ค์ผ ์๋ํฉ๋๋ค. ์ ํํ.
์ด๊ฒ์ด ์ฐ๋ฆฌ๋ฅผ ์ํด ์ผํ ์ ์ผํ ๊ฒ์ ๋๋ค ๐
์๋นํ ํฐ Next.js ์ฑ (v9.3.6)์์ ๋ง์ ์ฌ๋๋ค์ด ์ฑ ์์ (๊ฐ๋ฐ ๋ชจ๋)์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์์ต๋๋ค. NODE_OPTIONS="--max_old_space_size=4096"
์ค์ ์ด ๋
ธ๋ 10์ ๋์์ด๋์์ต๋๋ค. ๋
ธ๋ 12 ์ด์์์๋์ด ์ปค๋ฐ ๊ณผ ์ปจํ
์ด๋์ ํ ๋น ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ ๋ คํ๋ ๋ค๋ฅธ ์ปค๋ฐ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค (Linux ๋ง ํด๋น).
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ํ ๋ก ์ ์ถ๊ฐํ์ญ์์ค.
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๊ฒฝํ ํ ๋ค์ ๋ด ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์์ ๋์ต๋๋ค.๋ค์ ์ฝ๋ ์กฐ๊ฐ์์
const Icon
๊ฐundefined
๊ฒฝ์ฐ ์ฝ๋๋ ๊ตฌ์ฑ ์์๊ฐ ์ ํจํ์ง ํ์ธํ๋ ๋ฌดํ ๋ฃจํ์ ๋ค์ด๊ฐ๋๋ค.const iconMapping = { "flash-outline": FlashOutline, }; export const Icon = ({ name }) => { const Icon = iconMapping[name]; return <Icon />; }
const Icon
๊ฐ ์ ์๋์ด ์์ง ์์ ๊ฒฝ์ฐ ํ์ธ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.... const Icon = iconMapping[name]; if (!Icon) return null; return <Icon />; }
์ด ์ฝ๋๊ฐ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ์์์ต๋๊น?
ํฅ๋ฏธ๋กญ๊ฒ๋์ด ์ฝ๋๋ฅผ ๋ค์ ๋ณด๋ฉด ์ค์ ๋ก ๋ค๋ฅธ
๋ฌธ์ . Icon์ ๊ตฌ์ฑ ์์์ด๋ฉฐ Icon ๋ด๋ถ์์ Icon์ ์ฐธ์กฐํ์ต๋๋ค.
๊ทธ ์์ฒด.
๋ด๊ฐ ์์ ๋ธ ๋ฐฉ๋ฒ์ ๋๋ถ๋ถ ๊ตฌ์ฑ ์์๋ณ๋ก ๊ตฌ์ฑ ์์๋ฅผ ๋ถ๋ฆฌํ๊ณ
์ด๋ค ๊ตฌ์ฑ ์์๊ฐ ์๊ทน์ ๋ฐ์๋์ง ์ ๋๊น์ง ๋ฌธ์ ๋ฅผ ์ฌํํ์ญ์์ค.
๊ทธ.
2020 ๋ 5 ์ 21 ์ผ ๋ชฉ์์ผ 18:20์ Vivek_Neel [email protected]์ด ์์ฑํ์ต๋๋ค.
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ํ ๋ก ์ ์ถ๊ฐํ์ญ์์ค.
๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๊ฒฝํํ๊ณ ์์๋๋ฐ
์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ :๋ค์ ์ฝ๋ ์ค ๋ํซ์์ const ์์ด์ฝ์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ
์ฝ๋๋ ๊ตฌ์ฑ ์์๊ฐ ์ ํจํ์ง ํ์ธํ๋ ๋ฌดํ ๋ฃจํ์ ๋ค์ด๊ฐ๋๋ค.const iconMapping = {
"flash-outline": FlashOutline,
};
๋ด๋ณด๋ด๊ธฐ const ์์ด์ฝ = ({์ด๋ฆ}) => {
const ์์ด์ฝ = iconMapping [์ด๋ฆ];๋ฐํ
;
}const Icon์ด ์ ์๋์ด ์์ง ์์์ง ํ์ธ์ ์ถ๊ฐํ๋ฉด
๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ....
const ์์ด์ฝ = iconMapping [์ด๋ฆ];(! Icon) ๋ฐํ null;
๋ฐํ;
}์ด๊ฒ์ด ์ฝ๋์ ์ผ๋ถ๋ผ๋ ๊ฒ์ ์ด๋ป๊ฒ ์์์ต๋๊น?
๋ฐํ๋ฌผ?โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/zeit/next.js/issues/7929#issuecomment-632187103 ๋๋
๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/ABA2CL7ZJQY5YPYJVCJMCODRSVIE7ANCNFSM4ICM4RAA
.>
๋ด ํด๋ ์ ํ์์ ๋ณด๋
๋ด๊ฐ ์ดํดํ๋ ํ Next.js (v9.0.0 ์ดํ)๋ ๋๊ท๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๋น๋ ํ๋ก์ธ์ค๋ ํ๋ก์ ํธ์ ์๋ฒ ์ธก ๋ถ๋ถ์ ์ปดํ์ผํ๊ธฐ ์์ํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๋๋ฌํฉ๋๋ค.
๊ฐ๋ฐ ๋ชจ๋์์ ๋ก์ปฌ ์๋ฒ๋ ์ฒ์์๋ ์ ์์ด์ง๋ง ์ผ๋ง ํ ํ ๋น ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํญ๋ฐํ๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
ํต์ฌ ํ์ ๋๊ตฐ๊ฐ๊ฐ์ด ๋ฌธ์ ๋ฅผ ์ธ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ๋ถ๋ฅํ๋ ๋ฐ ๋์์ ์ฃผ์๊ฒ ์ต๋๊น?
์ ์ ์ ํ์ ๊ฐ๋ ฅํ ๋ฉํฑ์ ์ฌ์ฉํ๋๋ผ๋ ๋๋๋ก ๋ก์ปฌ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๊ฑฐ์ 1 ๋ ์ด ์ง๋ฌ์ง ๋ง ๋ฌธ์ ์ ๋ํ ๋ช ํํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์๊ฐํ ์์๋ ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ ๊ฐ์ ํ์ Next.js ํ๋ก์ ํธ๋ก ๋ถํ ํ๋ ๊ฒ์ ๋๋ค. ์ธ์ ๊ฐ๋ CI์์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋น๋ ํ ์ ์์ ๊น๋ด ๊ฑฑ์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค (์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ฐ๋ ฅํ ์ด๋ฅผ ์ํํ๊ธฐ์ํ VM).
์ฌ๊ธฐ์ ๋์ ๋์ด๋์ด์ ์ ๋ง ๋ฏธ์ ํด์, ๊ทธ๋ฅ ๋์์ ๊ตฌํ๊ณ ์์ด์.
ํธ์ง : Next.js 9.3.3์ผ๋ก ์ ๋ฐ์ดํธํ์ง๋ง ๊ฐ์ ๋์ง ์์์ต๋๋ค.
ํต์ฌ ํ์ ๋๊ตฐ๊ฐ๊ฐ์ด ๋ฌธ์ ๋ฅผ ์ธ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ๋ถ๋ฅํ๋ ๋ฐ ๋์์ ์ฃผ์๊ฒ ์ต๋๊น?
์ด ์ค๋ ๋์์ ์ ์ฒด ๋ณต์ ๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฒ ์์ฒญํ์ต๋๋ค. ํน์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ค ๊ฒ๋ ๋ถ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฌธ์ ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.
9.4 btw์์ ์์ค ๋งต ์์ฑ์ ๋ณ๊ฒฝ ํ์ผ๋ฏ๋ก ๋ฐ๋์ ์ต์ ๋ฒ์ ์ผ๋ก ์
๊ทธ๋ ์ด๋ํด์ผํฉ๋๋ค.
https://github.com/zeit/next.js/issues/7929#issuecomment -618297553๊ณผ ๊ฐ์ FWIW ์ฌ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์์ฑ ๋ ๋ฌดํ ๋ฃจํ์ด๋ฉฐ์ด๋ฅผ ์ ๊ฐ์ง ํ ์ ์์ต๋๋ค. ).
๋ด๊ฐ ์ดํดํ๋ ํ Next.js (v9.0.0 ์ดํ)๋ ๋๊ท๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๋น๋ ํ๋ก์ธ์ค๋ ํ๋ก์ ํธ์ ์๋ฒ ์ธก ๋ถ๋ถ์ ์ปดํ์ผํ๊ธฐ ์์ํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๋๋ฌํฉ๋๋ค.
๊ทํ๊ฐ ๋ณต์ ๋ฌผ์ ์ ๊ณตํ์ง ์์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ ๋ ์ฐ๋ฆฌ ์์ ์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ง ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
Next.js์์ ์๋ฐฑ๋ง ๊ฑด์ ์์ฒญ์ ์คํํ๊ณ ์คํํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ 300 ๊ฐ ์ด์์ ํ์ด์ง๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ ํ์์๋ณด๊ณ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ ์์์ผ๋ฉฐ ํ๋ฃจ ์ข ์ผ ์ฌ๋ฌ ํ์ด์ง์์ ์์ ํฉ๋๋ค.
์ด๊ฒ์ ๋ฌธ์ ๊ฐ์์ ์ ์๋ค๋ ๊ฒ์ ๋ถ์ธํ๋ ๊ฒ์ด ์๋๋ผ, ์ฐ๋ฆฌ๊ฐ ํ๋กํ์ผ ๋ง ํ ์์๋ ๋ช
ํํ ๋ณต์ ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๋์ง ์ถ์ ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ํ ๋๋ ์ ๋ฃ ์ปจ์คํ
์ ์์ฒญํ๋ ๊ฒ์ด ์๋๋ผ ์ ์ฒญ์๋ฅผ ๋ฌด๋ฃ๋ก ์ดํด๋ณผ ๊ฒ์
๋๋ค.
์ด ์ค๋ ๋์์ ์ ์ฒด ๋ณต์ ๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฒ ์์ฒญํ์ต๋๋ค. ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ค ๊ฒ๋ ๋ถ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌธ์ ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋ฌธ์ ๋ฅผ ์ฐ ์ดํ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ๊ธฐ์ ์ ์ฅ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ค์ ์ด๋ฆฐ ์ด์ ์ด๋ฉฐ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ค๋ฉด ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ํ์ํ๋ค๋ ๋ ์ด๋ธ์ด์๋ ๊ฒ์ ๋๋ค.
๊ฐ๋ด ํ ์ดํ๋ก
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ด ํด๋ผ์ด์ธํธ์ ์ํ๊ณ ์์ค ์ฝ๋๊ฐ ๋ซํ ์๊ธฐ ๋๋ฌธ์ ์ ์ฅ์๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
9.4 btw์์ ์์ค ๋งต ์์ฑ์ ๋ณ๊ฒฝ ํ์ผ๋ฏ๋ก ๋ฐ๋์ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํด์ผํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ตํธ ์ธ / ์ตํธ ์์์ ๋๊น? (์์ฃผ ์ค๋ ์ ) ์ด์๋ฅผ ์ฐ ํ ์์ค ๋งต ์์ฑ (ํ๋ฌ๊ทธ์ธ์ ํตํด ์ํ๋จ)์ ์ ๊ฑฐํ์ง๋ง ๊ทธ๋ค์ง ๋์์ด๋์ง ์์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ ํจํ์ง ์๋ค๊ณ ์๊ฐ๋๋ฉด ๋ซ์ผ์ญ์์ค. ์ ์ฅ์๋ ์ค๋ ์ ์ ๊ณต์ ๋์์ผ๋ฉฐ ๋ ์ด์ ์ ํจํ์ง ์์ ์ ์์ต๋๋ค.
์ฌ์ฌ๋ฅผ ๋์ ๋๋ฆด ์ ์์ง๋ง ์๋ด๊ฐ ํ์ํฉ๋๋ค.
โฒ styled-icons (master) โ yarn build:ci
yarn run v1.22.4
$ lerna run build
lerna notice cli v3.21.0
lerna info Executing command in 25 packages: "yarn run build"
lerna info run Ran npm script 'build' in '@styled-icons/styled-icon' in 6.6s:
$ tsc --project tsconfig.esm.json && mv dist/index.js dist/index.esm.js && tsc --project tsconfig.json
lerna ERR! yarn run build exited 1 in '@styled-icons/boxicons-logos'
lerna ERR! yarn run build stdout:
$ build-pack
Reading icon packs...
Error reading icons from pack
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
lerna ERR! yarn run build stderr:
error Command failed with exit code 1.
lerna ERR! yarn run build exited 1 in '@styled-icons/boxicons-logos'
lerna WARN complete Waiting for 4 child processes to exit. CTRL-C to exit immediately.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
์ฌ์์ ๋ด๊ฐ์ด ๊ฐ์ ํผํ๊ธฐ ๊ฒฝ์ฐ์ ์ฌ์์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ๊ธฐ์๋ณด๊ณ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๋ฌผ์๋ค ๋ฐ๋ผ์ ์ ์คํํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ฌํ ๋ฌธ์ ๊ฐ 100 % ๋์ผ ํ ๊ฐ๋ฅ์ฑ์ ๋งค์ฐ ๋ฎ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ตํธ ์ธ / ์ตํธ ์์์ ๋๊น? (์์ฃผ ์ค๋ ์ ) ์ด์๋ฅผ ์ฐ ํ ์์ค ๋งต ์์ฑ (ํ๋ฌ๊ทธ์ธ์ ํตํด ์ํ๋จ)์ ์ ๊ฑฐํ์ง๋ง ๊ทธ๋ค์ง ๋์์ด๋์ง ์์์ต๋๋ค.
์์ค ๋งต์ ๊ฐ๋ฐ์ ํญ์ ํ์ฑํ๋์ด ์์ง๋ง ํ๊ฐ ์์ค ๋งต์ผ๋ก ์ ํํ์ต๋๋ค.
์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ค์ ์ด๋ฆฐ ์ด์ ์ด๋ฉฐ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ค๋ฉด ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ํ์ํ๋ค๋ ๋ ์ด๋ธ์ด์๋ ๊ฒ์ ๋๋ค.
๋ ๋ง์ ๋ณด๊ณ ์๊ฐ ๊ณ์ ๋ค์ด์ค๊ณ ๊ณ์ ๋ณต์ ๋ฌผ์ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ๋ค์ ์ด์์ต๋๋ค : https://github.com/zeit/next.js/issues/7929#issuecomment -568760542
์ด ์ค๋ ๋์๋ 2 ๊ฐ์ ๋ณต์ ํ ๋ง ์ ๊ณต๋ฉ๋๋ค. ํ๋๋ Next.js ( now dev
๋ฉ๋ชจ๋ฆฌ ์๋น)์ ์์ ํ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๋ค๋ฅธ ํ๋๋ ์คํ / ๋น๋ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ๋ค์ ํ ๋ฒ ์ ์ฒด ๋ณต์ ๋ฅผ ์์ฒญํ๋ ์ด์ ๋ ๊ทธ๋ ์ง ์์ผ๋ฉด ์กฐ์ฌ๊ฐ ๊ณ์ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ด ํด๋ผ์ด์ธํธ์ ์ํ๊ณ ์์ค ์ฝ๋๊ฐ ๋ซํ ์๊ธฐ ๋๋ฌธ์ ์ ์ฅ์๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
[email protected] ์ผ๋ก ์ฐ๋ฝํด ์ฃผ์๋ฉด NDA๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.์ด ๋ชจ๋ ๊ฒ์ ์ค์ ํ๋ ๋ฐ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ์ ์ฌ์ ์ผ๋ก ๊ทํ๋ฅผ ์ํด ์ปจ์คํ ์ ์ํํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ํน์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋์์ด๋๋ฉฐ ํด๋ผ์ด์ธํธ ์ฉ ์์ฉ ํ๋ก๊ทธ๋จ๋ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค.
์ด ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋จ์ํ ํฌ๊ธฐ ๋ฒ์์ ๋๋ฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ์์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
NODE_OPTIONS=--max-old-space-size=4096
๋ฅผ ํตํด ์ถ๊ฐ๋ก ๋น๋๋ฅผ ์คํํด์ผํฉ๋๋ค.๋๋ ์๋ก์ด ์ฒญํน ๊ธฐ๋ฅ์ ํ์ฑํ ํ ์ ์์ต๋๋ค.
// next.config.js module.exports = { experimental: { granularChunks: true } }
์ด๊ฒ์ ์ฐ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค. ์ฐธ๊ณ ๋ก.
๋๊ตฌ๋์ด ๋ฌธ์ ๊ฐ ๋ด์ฅ ๋ ๋ค์ ์๋ฒ ์์์์ ๋ฐ์ํ๋์ง ์๊ณ ์์ต๋๊น?
์ฆ : Next start
๋์ NODE_ENV=production node server.js"
?
๋ด ๋ฌธ์ ๋ ๋น๋ ์์ฑ ํ ๋ฐ์ํฉ๋๋ค. "node server.js"๋ฅผ ์คํํ๋ ๋ด ์ฌ์ฉ์ ์ ์ ์๋ฒ์์ ํด๋น ์ค๋ฅ๋ฅผ ์์ ํ๊ณ ํ๋ก์ธ์ค๊ฐ ๋ค์ ์์๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ด๋ ์บ์ ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ํญ๋ชฉ์ ์์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ทธ ์ดํ์ ํ์ด์ง๋ฅผ ์ ๋ ฅํ๋ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์์๊ฒ๋ ์ ๋ง ๋๋ฆฝ๋๋ค. ๋ชจ๋ SSR์ด ์ผ์ด๋๊ณ ์์ต๋๋ค.
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
0|profiles | 1: 0xa093f0 node::Abort() [node /home/projects/profiles/server.js]
0|profiles | 2: 0xa097fc node::OnFatalError(char const*, char const*) [node /home/projects/profiles/server.js]
0|profiles | 3: 0xb842ae v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node /home/projects/profiles/server.js]
0|profiles | 4: 0xb84629 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node /home/projects/profiles/server.js]
0|profiles | 5: 0xd30fe5 [node /home/projects/profiles/server.js]
0|profiles | 6: 0xd31676 v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [node /home/projects/profiles/server.js]
0|profiles | 7: 0xd3def5 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node /home/projects/profiles/server.js]
0|profiles | 8: 0xd3eda5 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node /home/projects/profiles/server.js]
0|profiles | 9: 0xd4185c v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node /home/projects/profiles/server.js]
0|profiles | 10: 0xd0830b v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node /home/projects/profiles/server.js]
0|profiles | 11: 0x1049f4e v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node /home/projects/profiles/server.js]
0|profiles | 12: 0x13cf019 [node /home/projects/profiles/server.js]
์ด๊ฒ์ ๋ด package.json์ ๋๋ค.
{
"name": "profiles",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "node server.js",
"build": "yarn relay && next build",
"start": "NODE_ENV=production node server.js",
"relay": "relay-compiler --src ./ --exclude '**/.next/**' '**/node_modules/**' '**/test/**' '**/__generated__/**' --exclude '**/schema/**' --schema ./var/schema.graphql --artifactDirectory __generated__",
"relay-get-schema-stage": "graphql get-schema --project sourcr --endpoint stage && yarn run relay",
"relay-get-schema-prod": "graphql get-schema --project sourcr --endpoint prod && yarn run relay",
"relay-get-schema-dev": "graphql get-schema --project sourcr --endpoint dev && yarn run relay",
"pm2": "pm2"
},
"dependencies": {
"@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/plugin-proposal-decorators": "^7.10.5",
"@babel/plugin-proposal-export-default-from": "^7.10.4",
"@babel/plugin-proposal-optional-chaining": "^7.11.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.11.0",
"@fortawesome/fontawesome": "^1.1.8",
"@fortawesome/fontawesome-free-regular": "^5.0.13",
"@fortawesome/fontawesome-free-solid": "^5.0.13",
"@fortawesome/react-fontawesome": "^0.1.11",
"@sentry/browser": "^5.21.0",
"@svgr/webpack": "^5.4.0",
"babel-loader": "^8.1.0",
"babel-plugin-styled-components": "^1.11.1",
"babel-plugin-transform-export-extensions": "^6.22.0",
"bootstrap": "^4.5.2",
"classnames": "^2.2.6",
"file-loader": "^6.0.0",
"formsy-react": "^1.1.5",
"graphql": "^15.3.0",
"jwt-decode": "^2.2.0",
"mobx": "^5.15.5",
"moment": "^2.28.0",
"next": "9.5.1",
"path": "^0.12.7",
"pm2": "^4.5.0",
"query-string": "^6.13.1",
"react": "16.13.1",
"react-dom": "16.13.1",
"react-helmet": "^6.1.0",
"react-player": "^2.6.0",
"react-relay": "^10.0.1",
"react-relay-network-modern": "^4.7.4",
"react-relay-network-modern-ssr": "^1.4.0",
"react-toastify": "^6.0.8",
"relay-compiler": "^10.0.1",
"relay-devtools": "^1.4.0",
"relay-devtools-core": "^0.0.8",
"relay-runtime": "^10.0.1",
"sass": "^1.26.10",
"sass-resources-loader": "^2.0.3",
"siema": "^1.5.1",
"transform-class-properties": "^0.1.0"
},
"devDependencies": {
"babel-plugin-relay": "^10.0.1"
}
}
next build
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ฌ๋์ด๋ผ๋ฉด .babelrc
๋๋ babel.config.js
์ญ์ ํด๋ณด์ธ์. Next.js์ ๊ด๋ จ์ด์๋ ๋ด ํ๋ก์ ํธ์ ๋ณ๋ ๋ถ๋ถ์ ๋ํด .babelrc
์ด ์๋๋ฐ next build
๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. ์ ์ํฉ์์๋ ๋ฌธ์ ๊ฐ Docker์์๋ง ๋ฐ์ํ์ต๋๋ค. ๋ด Dockerfile์ ๋ณ๊ฒฝํ์ฌ ์์ ํ์ต๋๋ค.
FROM node:12
WORKDIR /app
COPY package.json package-lock.json /app/
ENV NODE_ENV production
RUN npm install
COPY . /app
RUN npm run build
RUN npm run next-build
EXPOSE 8081
CMD ["npm", "start"]
์ด์
FROM node:12
WORKDIR /app
COPY package.json package-lock.json /app/
ENV NODE_ENV production
RUN npm install
COPY . /app
RUN npm run build
# Let Next.js use its own Babel config
RUN rm .babelrc
RUN npm run next-build
EXPOSE 8081
CMD ["npm", "start"]
GitLab CI์์ ๊ณต์ ์คํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ์คํ๊ธฐ๋ SIGABRT
๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๊ณ ์ฐจ๋ก๋ก์ด ์ค๋ฅ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ฃน ์ฃผ์๋ก ๋ค์ ์ ํํ๊ณ ์๋ํ์ต๋๋ค.
next-transpile-modules
๊ฒฝ์ฐ ๋ด ํด๊ฒฐ์ฑ
์ ๋ค์๊ณผ ๊ฐ์ด resolveSymlinks
-setting (v4.1.0๋ถํฐ)์ ํ์ฑํํ๋ ๊ฒ์
๋๋ค.
// next.config.js
const withTM = require("next-transpile-modules")([
"somepackage"
], {
resolveSymlinks: true
})
module.exports = {
...withTM()
}
somepackage
๊ฐ "๋๋ฌด ์ปค์ก์ ๋"(500kb์์ 700kb๋ก) ์ฒ์์ ์ฌ๊ธฐ์ ์ค๋ช
๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด์ ๊ฐ์๊ธฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ (8GB ์ต์
์ผ๋ก ์๋)๊ฐ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์์ต๋๋ค. .
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ธฐํ ๊ธ์์ ์ผ๋ก ๋ถ ํ๋ฆฌ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ก ์ธํ ๋ฃจํ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@timneutkens ๋ ์ด์ repo๊ฐ โโ์์ผ๋ฏ๋ก ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์์ต๋๊น?