рдореИрдВ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдбреАрдЖрдИрдЖрд░ рдХреЛ рд░реВрдЯ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореЗрд░рд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗред
-/src
-рд╕рд░реНрд╡рд░
-...рдЖрджрд┐ред
рд░реИрдЬрд╝рд▓ рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдкрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЗрдмреЗрд▓ рдФрд░ рд╡реЗрдмрдкреИрдХ рдХреЛ рдХреЛрдб рдХреА рд▓реЛрдХреЗрд╢рди рдорд┐рд▓ рд░рд╣реА рд╣реИ
module.exports = {
dotenv: resolveApp('.env'),
appPath: resolveApp('.'),
appBuild: resolveApp('build'),
appBuildPublic: resolveApp('build/public'),
appManifest: resolveApp('build/assets.json'),
appPublic: resolveApp('public'),
appNodeModules: resolveApp('node_modules'),
appSrc: resolveApp('src'),
appPackageJson: resolveApp('package.json'),
appServerIndexJs: resolveApp('src'),
appClientIndexJs: resolveApp('src/client'),
testsSetup: resolveApp('src/setupTests.js'),
appBabelRc: resolveApp('.babelrc'),
appEslintRc: resolveApp('.eslintrc'),
appRazzleConfig: resolveApp('razzle.config.js'),
nodePaths: nodePaths,
ownPath: resolveOwn('.'),
ownNodeModules: resolveOwn('node_modules'),
publicUrl: getPublicUrl(resolveApp('package.json')),
servedPath: getServedPath(resolveApp('package.json')),
};
рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рди рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдд рд╣реИрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рдореИрдВ razzle рд╕реЗ razle.config.js рдкрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреБрдПрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдПрдХ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдБ
const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдкрд┐рдВрдЧ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдкрде рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ ...
appConfig.module.rules.map(rule => {
if (rule.include && rule.test) {
rule.include = [
resolveApp('server'),
resolveApp('src'),
];
}
})
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдкрде рдореЗрдВ рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рд╕рд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ createConfig рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмреЗрдирдХрд╛рдм рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЬрдм рднреА рдореИрдВ рдЪрд╛рд╣реВрдВ рдкрде рдмрджрд▓ рд╕рдХреВрдВ?
рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред рдХреГрдкрдпрд╛ рд╕рд╣рд╛рдпрддрд╛ рдХреАрдЬрд┐рдП :)
рд╣реЛрд▓рд╛! рддреЛ рдпрд╣рд╛рдБ рд╕реМрджрд╛ рд╣реИ, рдУрдкрди рд╕реЛрд░реНрд╕ рдФрд░ рдореЗрд░реЗ рджрд┐рди рдХреЗ рдХрд╛рдо рдФрд░ рдЬреАрд╡рди рдХреЗ рдмреАрдЪ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ GitHub рдмреЙрдЯ рдЗрд╕реЗ рдмрд╛рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рди рд▓реЗрдВ--рдЧрдВрднреАрд░рддрд╛ рд╕реЗ--рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИ, рддреЛ рдмрд╕ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рдореБрдЭреЗ рдбреАрдПрдо рдХрд░реЗрдВ, рдПрдХ рд╡рд╛рд╣рдХ рдХрдмреВрддрд░, рдпрд╛ рдПрдХ рдзреВрдореНрд░рдкрд╛рди рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдВред
рдХреБрдВрдЖред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ src . рдХреЗ рдЕрдВрджрд░ рдирдП рд╕рд░реНрд╡рд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛
рдФрд░ рдлрд┐рд░ razzle.config.js рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
config.entry.pop()
config.entry.push('./src/server')
рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рдж (--рдирд┐рд░реАрдХреНрд╖рдг) рдиреЛрдбрдЬ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ
рд╣реЛрд▓рд╛! рддреЛ рдпрд╣рд╛рдБ рд╕реМрджрд╛ рд╣реИ, рдУрдкрди рд╕реЛрд░реНрд╕ рдФрд░ рдореЗрд░реЗ рджрд┐рди рдХреЗ рдХрд╛рдо рдФрд░ рдЬреАрд╡рди рдХреЗ рдмреАрдЪ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ GitHub рдмреЙрдЯ рдЗрд╕реЗ рдмрд╛рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рди рд▓реЗрдВ--рдЧрдВрднреАрд░рддрд╛ рд╕реЗ--рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИ, рддреЛ рдмрд╕ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рдореБрдЭреЗ рдбреАрдПрдо рдХрд░реЗрдВ, рдПрдХ рд╡рд╛рд╣рдХ рдХрдмреВрддрд░, рдпрд╛ рдПрдХ рдзреВрдореНрд░рдкрд╛рди рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдВред
рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг ProBot рдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рд╣реЛрд▓рд░ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВрдЧреЗред
рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред
рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЛрдб рд╣реЛрд╕реНрдЯ рдХрд░рддреА рд╣реИ, рдФрд░ 'src' рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред
@nvma рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо _core_ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рддреЛ рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдПрдПрд╕рдПрдкреА рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред рдмрд▓реНрд▓реЗ рд╕реЗ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛: build
, src
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП, src
рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП, рдФрд░ public
ред
рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд░реИрдЬрд╝рд▓/рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдореЗрд░реЗ рд░рдбрд╛рд░ рдкрд░, рдПрдХ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ
рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рддреЛ рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реЗ razzle.config.js
рдореЗрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
const defaultOptions = {
server: null,
client: null,
};
function modifyEntryPoints(baseConfig, env, webpack, userOptions = {}) {
const options = { ...defaultOptions, ...userOptions };
const webpackConfig = { ...baseConfig };
const { client, server } = options;
/* This is required to rename the entry points instead of using the defaults */
if (env.target === "node" && server) {
webpackConfig.entry = [server];
}
if (env.target !== "node" && client) {
webpackConfig.entry.client = client;
}
return webpackConfig;
}
module.exports = {
plugins: [
{
func: modifyEntryPoints,
options: {
server: path.join(__dirname, "./src/docker-server"),
client: path.join(__dirname, "./src/docker-client"),
},
},
]
};
рджреЗрд╡ рдореЗрдВ рддрдп
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реЗ рд░рдбрд╛рд░ рдкрд░, рдПрдХ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ