рд╡рд░реНрддрдорд╛рди рдореЗрдВ API рдорд╛рд░реНрдЧреЛрдВ рдпрд╛ рдкреГрд╖реНрдареЛрдВ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдореИрдВ fs.readFile
рдХреЛ __dirname
рдкрде рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ "рдмрд╕ рдХрд╛рдо" рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реЗ рдХреБрдЫ рдХреНрд╖рдорддрд╛ рдореЗрдВ @zeit/webpack-asset-relocator-loader
рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдареАрдХ рд░рд╣реВрдВрдЧрд╛ рдЬреЛ _only_ __dirname
рдФрд░ __filename
(рдХреЛрдИ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдпрд╛ cwd-рдЖрдзрд╛рд░рд┐рдд рдкрде рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг:
// pages/api/test.js
import fs from 'fs'
import path from 'path'
export default (req, res) => {
const fileContent = fs.readFileSync(
path.join(__dirname, '..', '..', 'package.json'),
'utf8'
)
// ...
}
рдиреЛрдЯ: рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг тШЭя╕П рдХреЛ
require
рд╕рд╛рде рдзреЛрдЦрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдореИрдВ
рдмрд╕ рдЗрд╕реЗ рджреВрд╕рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕реЗ рдПрд╕ 3 рдмрд╛рд▓реНрдЯреА рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреА рд╕рд╣рдорддрд┐ рджреЗрддрд╛ рд╣реВрдБ! рд╕рд╛рде рд╣реА, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдореЗрд░реА рдХрдВрдкрдиреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдЬреИрд╕реЗ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред
рдЙрдкрд░реЛрдХреНрдд рдкреАрдЖрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдЧрд╛! я╕П ЁЯЩП
рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ fs.writeFile
рдореЗрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, /api/route
рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╡реЗрдмрд╣реБрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ JSON рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВ
рдЕрд░реЗ @marlonmarcello , рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдмрдиреЗ рд░рд╣реЗрдВ
рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ?
рдЕрднреА рдирд╣реАрдВ, рдЖрдк #8334 . рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ
@ huv1k рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдХреНрдпрд╛ рдЗрд╕реЗ рдФрд░ рддреЗрдЬрд╝реА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?
рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп: рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ resolveJsonModule
true
рдореЗрдВ tsconfig.json
)ред рдЬреИрд╕реЗ:
import myJson from '../../../some/path/my.json';
JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
# next.config.js
module.exports = {
serverRuntimeConfig: {
PROJECT_ROOT: __dirname
}
}
рдФрд░ рд╕реНрдерд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
import fs from 'fs'
import path from 'path'
import getConfig from 'next/config'
const { serverRuntimeConfig } = getConfig()
fs.readFile(path.join(serverRuntimeConfig.PROJECT_ROOT, './path/to/file.json'))
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдмрд╣реБрдд рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ ( /public/images
рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛)ред
рдкреАрдЖрд░ рдореЗрдВ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ - рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ (рдпрд╛ рдирд╣реАрдВ) рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдорди рдХрд░реЗрдВ + рдЗрддрдиреЗ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдЗрд╕реЗ рдПрдХ рд╢реЙрдЯ рдХреНрдпреЛрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рдпрд╣ Next.js рдХреЗ рд╕рд╛рде рдиреЗрдХреНрд╕рд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
# next.config.js module.exports = { serverRuntimeConfig: { PROJECT_ROOT: __dirname } }
рдФрд░ рд╕реНрдерд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
import fs from 'fs' import path from 'path' import getConfig from 'next/config' const { serverRuntimeConfig } = getConfig() fs.readFile(path.join(serverRuntimeConfig.PROJECT_ROOT, './path/to/file.json'))
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдмрд╣реБрдд рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (
/public/images
рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛)ред
рдЬрд╝рдмрд░реНрджрд╕реНрдд рдорд░реНрджред рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред
рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирдИ getStaticProps
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (#9524 рдореЗрдВ)ред рд╡рд┐рдзрд┐ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╢рд┐рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ Next.js рдЯреАрдо рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг:
export async function unstable_getStaticProps() {
const siteData = await import("../data/pages/siteData.json");
const home = await import("../data/pages/home.json");
return {
props: { siteData, home }
};
}
@ рд╕реНрдХреЙрдЯрд╕реНрдорд┐рде 95 рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕реБрдХред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдФрд░ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЕрдкрдиреА рдЕрдзрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИред
@ScottSmith95 рдореЗрд░реЗ рдкрд╛рд╕ _all_ рдкреНрд░рд╢реНрди рд╣реИрдВ
src
?)@Svish рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднреАрддрд░ рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ/рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред (рдкреЗрдЬ /рдкреЗрдЬ рдореЗрдВ рд╣реИрдВ, рди рдХрд┐ /src/pragesред) рдпрд╣ рдкреЗрдЬ рдХрдВрдкреЛрдиреЗрдВрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдкреНрд░реЙрдкреНрд╕ рд╣реЛрдо рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдбрд┐рдлреЙрд▓реНрдЯ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рд╣реИ):
// /pages/index.js
const Home = ({ siteData, home }) => {
return (
<>
<Head>
<meta name="description" content={siteData.siteDescription} />
<meta name="og:description" content={siteData.siteDescription} />
<meta
name="og:image"
content={getAbsoluteUrl(siteData.siteImage, constants.siteMeta.url)}
/>
</Head>
<section className={`container--fluid ${styles.hero}`}>
<SectionHeader section={home.hero} heading="1">
<div className="col-xs-12">
<PrimaryLink
href={home.hero.action.path}
className={styles.heroAction}
>
{home.hero.action.text}
</PrimaryLink>
</div>
</SectionHeader>
<div className={styles.imageGradientOverlay}>
<img src={home.hero.image.src} alt={home.hero.image.alt} />
</div>
</section>
</>
);
};
рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП, рдЧрддрд┐рд╢реАрд▓ рдорд╛рд░реНрдЧреЛрдВ рд╡рд╛рд▓реЗ, рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ:
// /pages/studio/[member.js]
export async function unstable_getStaticProps({ params }) {
const siteData = await import("../../data/pages/siteData.json");
const member = await import(`../../data/team/${params.member}.json`);
return {
props: { siteData, member }
};
}
рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдЧрддрд┐рд╢реАрд▓ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде, getStaticPaths()
рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдЙрд╕ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП RFC рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдЯреАрдо рдХреЗ рд╕рднреА рд╕рджрд╕реНрдп рдбреЗрдЯрд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдХреЗ рдФрд░ рдЗрд╕реЗ Next.js рдкрд░ рднреЗрдЬрдХрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред
// /pages/studio/[member.js]
export async function unstable_getStaticPaths() {
const getSingleFileJson = async path => await import(`../../${path}`);
// These utility functions come from `@asmallstudio/tinyutil` https://github.com/asmallstudio/tinyutil
const directoryData = await getDirectory(
"./data/team",
".json",
getSingleFileJson,
createSlugFromTitle
);
const directoryPaths = directoryData.reduce((pathsAccumulator, page) => {
pathsAccumulator.push({
params: {
member: page.slug
}
});
return pathsAccumulator;
}, []);
return directoryPaths;
}
@ ScottSmith95 рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдордп рд╣реЛ рддреЛ рдХреБрдЫ рдЕрдиреБрд╡рд░реНрддреА рдкреНрд░рд╢реНрди:
next export
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп?getStaticPaths
рдкрде рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдЬреЛ рддрдм (рдЕрдЧрд▓реЗ рджреНрд╡рд╛рд░рд╛) рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП getStaticProps
рдореЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдлреАрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?getStaticProps
рдмрд┐рдирд╛ getStaticPaths
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП?getStaticProps
рдореЗрдВ _app
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╛рдЗрдЯ рд╡рд╛рдЗрдб рдХреЙрдиреНрдлрд┐рдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ?рдПрдкрд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ ?? рд╡реЗ рд╣реБрдХ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдкрд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВред рдореИрдВ рдЕрдЧрд▓реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ _dirname рдХреЛ рдПрдХ env рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдкреАрдЖрдИ рд╕реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред рдЗрд╕реЗ рдЕрдм рддрдХ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдпрд╣ рддреИрдирд╛рддреА рдХреЗ рдмрд╛рдж рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?
@ рдЬреЛрд╕рд┐рдпрд╛рд╕-рдЖрд░ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрдврд╝реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ ( js
/ json
рдЖрдо рддреМрд░ рдкрд░ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдЬреИрд╕реЗ .jade
рдХреЛ рдЙрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдПрдХ рдЕрд▓рдЧ @now/node
рд▓реИрдореНрдмреНрдбрд╛/рддреИрдирд╛рддреА рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ/рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдХреЛрдИ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
@BrunoBernardino рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ src рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ fs.readdirSync(my_dirname_env_var)
рд╡рд┐рдзрд┐ рднреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рддрд╛рдХрд┐ рддреИрдирд╛рддреА рдХреЗ рдмрд╛рдж рднреА рдбреАрдЖрдИрдЖрд░ рдореМрдЬреВрдж рди рд╣реЛред рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЬреЗрд╕рди рдХреЗ рдкреВрд░реНрдг рдкрде рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдорд┐рд▓рддрд╛ рд╣реИ:
ERROR Error: ENOENT: no such file or directory, open '/zeit/3fc37db3/src/content/somejsonfilethatexists.json'
рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ npm start
рдЪрд▓рд╛рддрд╛ рд╣реВрдВред
@ рдЬреЛрд╕рд┐рдпрд╛рд╕-рдЖрд░ рдзрдиреНрдпрд╡рд╛рдж! рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде (рдХреЛрдИ рдЪрд░ рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде fs.readdirSync
рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ (рдХреЗрд╡рд▓ рддреИрдирд╛рддреА рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)? рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдк рдХреЛрдб рдХреЗ рдЙрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдирд╛, рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдирд╛) рдХрд╣реАрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ ( getInitialProps
рдпрд╛ рдХреБрдЫ), рддрд╛рдХрд┐ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрдард╛рддреА рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб/рддрд░реНрдХ рдореЗрдВ var рдХреЗ рд╕рд╛рде рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрд╣ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рди рд╣реЛред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ __dirname
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@BrunoBernardino рдореИрдВ рд░реВрдЯ-рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдкрде ./
рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЯреНрд░реА рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдореБрдЭреЗ рдЬреЛ рдорд┐рд▓рд╛ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд JSON рдерд╛ (рд╕реВрдЪреАрдмрджреНрдз рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд┐рдирд╛):
{
"path": "./",
"name": ".",
"type": "folder",
"children": [
{
"path": ".//.next",
"name": ".next",
"type": "folder",
"children": [
{
"path": ".//.next/serverless",
"name": "serverless",
"type": "folder",
"children": [
{
"path": ".//.next/serverless/pages",
"name": "pages",
"type": "folder",
"children": [
{
"path": ".//.next/serverless/pages/api",
"name": "api",
"type": "folder",
"children": [
{
"path": ".//.next/serverless/pages/api/posts",
"name": "posts",
"type": "folder",
"children": [
{
"path": ".//.next/serverless/pages/api/posts/[...id].js",
"name": "[...id].js",
"type": "file"
}
]
}
]
}
]
}
]
}
]
},
{
"path": ".//node_modules",
"name": "node_modules",
"type": "folder",
"children": ["alot of children here ofc"]
},
{ "path": ".//now__bridge.js", "name": "now__bridge.js", "type": "file" },
{
"path": ".//now__launcher.js",
"name": "now__launcher.js",
"type": "file"
}
]
}
рдЖрдкрдХреА JSON рдлрд╝рд╛рдЗрд▓ рд╡рд╣рд╛рдБ рдЧрд╛рдпрдм рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдКрдкрд░ рд╕реБрдЭрд╛рдпрд╛ рдерд╛? рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЪрд▓рд╛рдиреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рд╣рдореЗрд╢рд╛ рдЧрддрд┐рд╢реАрд▓ рдкрде рдирд╣реАрдВ рдЙрдард╛рддреЗ рд╣реИрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдкрде рдХреЛ рдордЬрдмреВрд░ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрддреАрдд рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ?
@BrunoBernardino рдореИрдВрдиреЗ рдПрдХ рдЧреИрд░ рдПрдкреАрдЖрдИ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ import()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдПрдкреАрдЖрдИ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдиреЗ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред
... рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдерд┐рд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рд╡рд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪ рд╕рдВрднрд╡ рд╣реЛрдЧреАред
рдореБрдЭреЗ рд╣реИрдХреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рднреА рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдЙрддрд░реЗрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдиреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди-рд░реЗрдбреА рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ "рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ" рд╕рдорд░реНрдерд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
# next.config.js module.exports = { serverRuntimeConfig: { PROJECT_ROOT: __dirname } }
рдФрд░ рд╕реНрдерд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
import fs from 'fs' import path from 'path' import getConfig from 'next/config' const { serverRuntimeConfig } = getConfig() fs.readFile(path.join(serverRuntimeConfig.PROJECT_ROOT, './path/to/file.json'))
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдмрд╣реБрдд рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (
/public/images
рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛)редрдЬрд╝рдмрд░реНрджрд╕реНрдд рдорд░реНрджред рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред
рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ now
рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
ENOENT: no such file or directory, open '/zeit/41c233e5/public/images/my-image.png'
at Object.openSync (fs.js:440:3)
at Object.readFileSync (fs.js:342:35)
at getEmailImage (/var/task/.next/serverless/pages/api/contact/demo.js:123:52)
at module.exports.7gUS.__webpack_exports__.default (/var/task/.next/serverless/pages/api/contact/demo.js:419:87)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async apiResolver (/var/task/node_modules/next/dist/next-server/server/api-utils.js:42:9) {
errno: -2,
syscall: 'open',
code: 'ENOENT',
path: '/zeit/41c233e5/public/images/my-image.png'
}
рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдорд╛рд░реНрдЧ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдореВрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛:
ENOENT: no such file or directory, open '/zeit/5fed13e9/images/my-image.png'
at Object.openSync (fs.js:440:3)
at Object.readFileSync (fs.js:342:35)
at getEmailImage (/var/task/.next/serverless/pages/api/contact/demo.js:124:52)
at module.exports.7gUS.__webpack_exports__.default (/var/task/.next/serverless/pages/api/contact/demo.js:331:87)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async apiResolver (/var/task/node_modules/next/dist/next-server/server/api-utils.js:42:9) {
errno: -2,
syscall: 'open',
code: 'ENOENT',
path: '/zeit/5fed13e9/images/my-image.png'
}
@PaulPCIO рдЖрдк рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ .json
, .js
, рдпрд╛ .ts
рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИред /public
рддрд╣рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдПрдХ рд╕реАрдбреАрдПрди рдкрд░ "рддреИрдирд╛рдд" рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реИрдореНрдмреНрдбрд╛ (AFAIK) рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд▓реИрдореНрдмреНрдбрд╛ ( @now/node
) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ includeFiles
рд╕рд╛рде рддреИрдирд╛рддреА base64
рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ var (рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╛ рдирд╣реАрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдзрдиреНрдпрд╡рд╛рдж @BrunoBernardino рдЬрд┐рддрдирд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдореИрдВ base64
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛
рдпрд╣ рддреИрдирд╛рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ __dirname рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрдХрд▓реНрдк рд╣реИ ??
@NicolasHz рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдЖрдкрдХрд╛ рдкреНрд░рд╢реНрди рдареАрдХ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред
@BrunoBernardino рдореЗрд░реА рд╕рд╣рд┐рдд рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ "рдирдХреНрд╢рд╛ _dirname
рдЕрдЧрд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ" рд╣реИрдХ рддреИрдирд╛рддреА рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбрдмреНрд▓реНрдпреВ/рдЬреЗрдПрд╕ рдФрд░ рдЬреЗрдПрд╕рдУрдПрди рдлрд╛рдЗрд▓реЗрдВ рднреАред рдХрдо рд╕реЗ рдХрдо now
рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдХрд╕реНрдЯрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
@BrunoBernardino рдореИрдВ рддреИрдирд╛рдд env рдкрд░ рд╕реНрдерд╛рдиреАрдп рдкрде рдХреА рдУрд░
рд╕рдордЭ рдЧрдпрд╛ @NicolasHz ред рд╣рд╛рдБ, рдЖрдкрдХреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ/рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмрд╕ рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реБрдП, config.js рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
# next.config.js
module.exports = {
env: {
PROJECT_DIRNAME: __dirname,
},
}
рдФрд░ рдПрдкреАрдЖрдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╕рднреА рдкреЛрд╕реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рднреА рдмреНрд▓реЙрдЧ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ)
import fs from 'fs'
import { join } from 'path'
const postsDirectory = join(process.env.PROJECT_DIRNAME, 'allPosts')
рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдм zeit рдкрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИред
[POST] /api/postsApi
11:00:13:67
Status:
500
Duration:
8.1ms
Memory Used:
76 MB
ID:
kxq8t-1585546213659-5c3393750f30
User Agent:
axios/0.19.2
{
fields: [ 'title', 'date', 'slug', 'author', 'coverImage', 'excerpt' ],
page: 1
}
2020-03-30T05:30:13.688Z 572075eb-4a7a-47de-be16-072a9f7005f7 ERROR Error: ENOENT: no such file or directory, scandir '/zeit/1cc63678/allPosts'
at Object.readdirSync (fs.js:871:3)
at getPostSlugs (/var/task/.next/serverless/pages/api/postsApi.js:306:52)
at module.exports.fZHd.__webpack_exports__.default (/var/task/.next/serverless/pages/api/postsApi.js:253:86)
at apiResolver (/var/task/node_modules/next/dist/next-server/server/api-utils.js:48:15)
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
errno: -2,
syscall: 'scandir',
code: 'ENOENT',
path: '/zeit/1cc63678/allPosts'
}
@sjcodebook рдЬреИрд╕реЗ @BrunoQuaresma рдиреЗ рдХрд╣рд╛, рдХрд┐ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ @now/node
рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдРрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╛ рдЬреЛ рднреА рд╕реНрдерд┐рд░ рдкрд░рд┐рдгрд╛рдо рдореБрдЭреЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд╛рд╣рд┐рдП)ред рдереЛрдбрд╝реЗ рдкрд╛рдЧрд▓, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рдп @BrunoBernardino... рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХрд╕реНрдЯрдо рдиреЛрдб рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ?
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ "рд╢рд╛рдорд┐рд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ " рд╕реЗрдЯрд┐рдВрдЧ рдХреНрдпреЛрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ
@valse рдпрд╣ рдПрдХ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░реЗ now.json
рдХрд╛ рдПрдХ рдЕрдВрд╢ рд╣реИ:
{
"builds": [
{
"src": "next.config.js",
"use": "@now/next"
},
{
"src": "lambdas/**/*.ts",
"use": "@now/node",
"config": {
"includeFiles": ["email-templates/**"]
}
}
],
"routes": [
{
"src": "/lambdas/(.+)",
"dest": "/lambdas/$1.ts"
}
]
}
рдЗрд╕ рддрд░рд╣ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
await ky.post(`${hostUrl}/lambdas/email?token=${someToken}`);
рдЕрдЧрд▓реЗ рдПрдкреАрдЖрдИ рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ рд╕реЗ, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ lambdas/email.ts
рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ pug
рдЬреИрд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдорджрдж рдХрд░реЗрдВрдЧреЗ!
рд╕рд╛рде рд╣реА, "includeFiles" рдХреЗрд╡рд▓ @now/node
рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдЕрдиреНрдп, рд▓реЗрдХрд┐рди @now/next
)
@BrunoBernardino рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ node
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрдм рдпрд╣ рдИрдПрд╕рдПрдо рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ!
рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ mdx рдкреГрд╖реНрдареЛрдВ рдХреА рд╕реВрдЪреА рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ:
рдХреЛрдб
import { NextApiRequest, NextApiResponse } from 'next'
import { promises as fs } from 'fs'
import { join } from 'path'
const { readdir } = fs
export default async (req: NextApiRequest, res: NextApiResponse) => {
const postFiles = await readdir(join(process.cwd(), 'pages', 'blog'))
const postNames: string[] = postFiles.filter((page: string) => page !== 'index.tsx')
const posts = []
for (const post of postNames) {
const mod = await import(`../pages/blog/${post}`)
posts.push({ ...mod, link: post.slice(0, post.indexOf('.')) })
}
res.status(200).json([])
}
рдореБрдЭреЗ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
export const title = 'My new website!'
^^^^^^
SyntaxError: Unexpected token 'export'
@talentlessguy рдореИрдВ Zeit/Vercel рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ, рдмрд╕ рдПрдХ рдЦреБрд╢ рдЧреНрд░рд╛рд╣рдХ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдЧреНрд░рд╛рд╣рдХ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЙрд╕ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:
process.cwd()
рдХреЗ рдмрдЬрд╛рдп рдмрд╕ рдХреБрдЫ рднреА рдирд╣реАрдВ рдпрд╛ __dirname
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВNextApiRequest
рдФрд░ NextApiResponse
рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ @now/node"
рд╕реЗ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рддреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ:import { NowRequest, NowResponse } from '@now/node';
pages/...
рд╕реЗ рдЖрдпрд╛рдд/рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ includeFiles
рдорд╛рдзреНрдпрдо рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЖрдкрдХрд╛ now.json
рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?@рдмреНрд░реВрдиреЛрдмрд░реНрдирд╛рд░реНрдбрд┐рдиреЛ
рдореИрдВ __dirname
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ /
, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп process.cwd()
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрде рджрд┐рдЦрд╛рддрд╛ рд╣реИ
рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛:
рд▓реИрдореНрдмреНрдбрд╛/posts.ts
import { NowResponse, NowRequest } from '@now/node'
import { promises as fs } from 'fs'
import { join } from 'path'
const { readdir } = fs
export default async (req: NowRequest, res: NowResponse) => {
const postFiles = await readdir(join(process.cwd(), 'pages', 'blog'))
const postNames: string[] = postFiles.filter((page: string) => page !== 'index.tsx')
const posts = []
for (const post of postNames) {
const mod = await import(`../pages/blog/${post}`)
posts.push({ ...mod, link: post.slice(0, post.indexOf('.')) })
}
res.status(200).json([])
}
now.json
{
"builds": [
{
"src": "next.config.js",
"use": "@now/next"
},
{
"src": "lambdas/**/*.ts",
"use": "@now/node",
"config": {
"includeFiles": ["pages/blog/*.mdx"]
}
}
],
"routes": [
{
"src": "/lambdas/(.+)",
"dest": "/lambdas/$1.ts"
}
]
}
рддреНрд░реБрдЯрд┐ рдореБрдЭреЗ рдорд┐рд▓рддреА рд╣реИ:
import Meta from '../../components/Article/Meta.tsx'
^^^^^^
SyntaxError: Cannot use import statement outside a module
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЛрдб рдлрд╝рдВрдХреНрд╢рди .mdx
рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рди рд╕рдХрддрд╛ :(
рдареАрдХ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓ рдЧрдИ рд╣реИред рд╕реАрдзреЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдЙрд╕ рдХрд╛рдо рдХреА рддрд░рд╣ рдПрдХ рдЖрдпрд╛рдд рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдмреИрдмреЗрд▓ рдЬрд╛рджреВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЖрдк рд╕рд╛рджреЗ рдЯреАрдПрд╕ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВред
@BrunoBernardino рдЖрдк рд╕рд╣реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рджрд╛ ts рдирд╣реАрдВ рд╣реИ ... рдореЗрд░реЗ рдкрд╛рд╕ esnext рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдФрд░ esnext рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рднреА рд╣реИ, рдпрд╣ рд╕рдм рдХреБрдЫ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ... рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рд╡реИрд╕реЗ рднреА рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЧреВрдЧрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ
рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВред рдХреБрдЫ рд╕реБрдЭрд╛рд╡ https://mdxjs.com/advanced/typescript рдФрд░ https://mdxjs.com/getting-started/webpack рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ @now/node
рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред рд╡реИрд╕реЗ рднреА, рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдорджрджрдЧрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдкрд░ рдХреЛрдИ рдЖрдВрджреЛрд▓рди? рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓ рдИрдореЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЕрднреА рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╣реИрдХ рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред
рдПрдХ рдФрд░ рд╣реИрдХ рд╡реЗрдмрдкреИрдХ рдХрдЪреНрдЪреЗ-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдПрд╕ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реИред
yarn add --dev raw-loader
const templates = {
verify: require("raw-loader!../template/email/verify.hbs").default,
};
рдлрд┐рд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ templates.verify
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЕрдЧрд▓рд╛-i18next рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИ рдЬреЛ рдЗрд╕ рдПрдХ ( vercel/vercel#4271 ) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ now
рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ /public/static/locales/
рдЕрдВрджрд░ рд╕реНрдерд┐рдд .json
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд╣реАрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдЬрдм рддрдХ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрдЧрд▓реЗ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдХреНрдпрд╛ рдХреЛрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
@borispoehland рдХреНрдпрд╛ рдЖрдкрдиреЗ рдКрдкрд░ рд╕реЗ рдЖрдпрд╛рдд/рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ? рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
@borispoehland рдХреНрдпрд╛ рдЖрдкрдиреЗ рдКрдкрд░ рд╕реЗ рдЖрдпрд╛рдд/рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ? рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
@ рдмреНрд░реВрдиреЛрдмрд░реНрдирд╛рд░реНрдбрд┐рдиреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рддреБрдо рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рдм рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ .json
рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ public/static/locales
serverless рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ? рдФрд░ рдпрд╣ рдХрд╣рд╛рдВ рдХрд░рдирд╛ рд╣реИ (рдХрд┐рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ)?
рдореИрдВ рдЕрдЧрд▓рд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, includeFiles
@now/next
рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдЖрдИрдбреАрдХреЗ рдЕрдЧрд░ рдЗрд╕рд╕реЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпреЛрдВрдХрд┐ next-i18next
рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ рд╣реИ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореИрдВ рд╡рд╣рд╛рдВ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛), рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ next-i18next
рд╕реАрдзреЗ рдЙрди рддрдХ рдкрд╣реБрдВрдЪреЗрдВ (рдЙрдкрд░реЛрдХреНрдд рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ PROJECT_DIRNAME
рдХреЛ next.config.json
рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЖрдпрд╛рдд рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ)ред рдЬреИрд╕реЗ vercel/vercel#4271 , рдореИрдВ рд╕рд┐рд░реНрдл now
рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА .json
рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд▓реЗ рдЬрд╛рдПред
@borispoehland _any_ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ pages/api
рдЕрдВрджрд░ (рдпрд╛ рдЬреЛ рд╡рд╣рд╛рдВ рдПрдХ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), https://github.com/vercel/next.js/issues/8251#issuecomment -544008976 рдЬреИрд╕рд╛ рдХреБрдЫ
рдЖрдкрдХреЛ рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рд╡рд░реНрд╕реЗрд▓ рдЪрд▓рддрд╛ рд╣реИ рддреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рд╣реИред
@borispoehland _any_ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
pages/api
(рдпрд╛ рдЬрд┐рд╕реЗ рд╡рд╣рд╛рдВ рдПрдХ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рдЕрдВрджрд░, # 8251 (рдЯрд┐рдкреНрдкрдгреА) рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░реЗрдВрдЖрдкрдХреЛ рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рд╡рд░реНрд╕реЗрд▓ рдЪрд▓рддрд╛ рд╣реИ рддреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рд╣реИред
@BrunoBernardino рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА json рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреЛрдЭрд┐рд▓ рд╣реИред рдХреНрдпрд╛ now
рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ: "рдЕрд░реЗ, рдХреГрдкрдпрд╛ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдЬреЗрд╕рди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЙрдард╛рдПрдВ"? рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ json
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЕрдВрдХ рдЦреЛрд▓рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ , рдЕрдЧрд░ рдХреЛрдИ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @BrunoBernardino !
__dirname
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк / рд╕рдорд╛рдзрд╛рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╡реЗрдмрдкреИрдХ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдиреЛрдб рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреЛ рдЙрдкрдирд╛рдо рджреЗрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдмрддрд╛рддреЗ:
https://webpack.js.org/configuration/node/
рдФрд░ рд╡реЗрдмрдкреИрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ __dirname
рдФрд░ __filename
рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝рдирд╛ рд╣реИ, рдпрд╛рдиреА рдЙрдиреНрд╣реЗрдВ рдкреЙрд▓реАрдлрд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдиреЛрдб рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрдирд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, Next.js рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡реЗрдмрдкреИрдХ рдбрд┐рдлреЙрд▓реНрдЯреНрд╕ https://github.com/vercel/next.js/blob/bb6ae2648ddfb65a810edf6ff90a86201d52320c/packages/next/build/webpack-config.ts#L661 -L663 рдХрд╛ рдЙрдкрдпреЛрдЧ/рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЙрд╕ рд╕рдм рдиреЗ рдХрд╣рд╛, рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдбрдЬрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрд╕реНрдЯрдо рдиреЗрдХреНрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред
рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпрд╣ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рди рд╣реА рд╕рднреА Next.js рдЗрдХрд╛рдИ/рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рде рд╣реА, рдиреЗрдХреНрд╕реНрдЯ рдХреЗ рдкрд╛рд╕__dirname
рдФрд░__filename
рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдлрд┐рд░, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд╛рде рд╣реА, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкреНрд▓рдЧрдЗрди рдХреЛ next-compose-plugins
рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/cyrilwanner/next-compose-plugins
рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: https://nextjs.org/docs/api-reference/next.config.js/custom-webpack-config
const withCustomWebpack = (nextCfg) => {
return Object.assign({}, nextCfg, {
webpack(webpackConfig, options) {
// We only want to change the `server` webpack config.
if (options.isServer) {
// set `__dirname: false` and/or `__filename: false` here to align with webpack defaults:
// https://webpack.js.org/configuration/node/
Object.assign(webpackConfig.node, { __dirname: false });
}
if (typeof nextCfg.webpack === 'function') {
return nextCfg.webpack(webpackConfig, options);
}
return webpackConfig;
},
});
};
рдореИрдВрдиреЗ @jkjustjoshing рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдФрд░ рдЬрдм рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рддрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрдм рдореИрдВ рдРрдк рдХреЛ рд╡рд░реНрд╕реЗрд▓ рдкрд░ рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
Error: GraphQL error: ENOENT: no such file or directory, open '/vercel/37166432/public/ts-data.csv'
рдореЗрд░рд╛ рдХреЛрдб:
const content = await fs.readFile(
path.join(serverRuntimeConfig.PROJECT_ROOT, "./public/ts-data.csv")
);
рдпрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/bengrunfeld/trend-viewer/blob/master/pages/api/graphql-data.js
@bengrunfeld рд╣рд╛рдБ, рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдереА (рдПрдХ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛) рдФрд░ рд╕рдорд╛рдзрд╛рди рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЖрд╕рд╛рди рдерд╛ред
рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ path.resolve('./public/ts-data.csv')
@borispoehland рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж !! рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛!
@bengrunfeld рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрдпреЛрдЧ рд╕реЗ рднреА рдкрд╛рдпрд╛ ( @BrunoBernardino ;))ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╣рд░ рдХрд┐рд╕реА рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдЖрдкрдХреЛ рдЕрднреА рднреА next.config.js
ред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ @borispoehland рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдПрдХ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдКрдкрд░ @jkjustjoshing рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛,
# next.config.js
module.exports = {
serverRuntimeConfig: {
PROJECT_ROOT: __dirname
}
}
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдЖрдкрдХреЛ рдЕрднреА рднреА
next.config.js
ред рдореИрдВрдиреЗ рдЗрд╕реЗ рддрдм рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрдм рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ @borispoehland рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХреАредрдореИрдВрдиреЗ рдЗрд╕реЗ рдКрдкрд░ @jkjustjoshing рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛,
# next.config.js module.exports = { serverRuntimeConfig: { PROJECT_ROOT: __dirname } }
@bengrunfeld рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрд┐рдВрджреБ рдкрд░ PROJECT_ROOT
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдпрд╣ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ?
рд╡рд░реНрд╕реЗрд▓ рдореЗрдВ рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдПрдХ рдкреЗрдЬ рдореЗрдВ readFile
рдХреИрд╕реЗ рд▓рд┐рдЦреВрдВ рдЬреЛ рдПрд╕рдПрд╕рдЬреА рдФрд░ рдПрд╕рдПрд╕рдЖрд░/рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛?
рдЬрд╣рд╛рдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдбреЗрдореЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА: https://github.com/mathdroid/blog-fs-demo
@mathdroid рдХреНрд░рдорд╢рдГ readFile
рдФрд░ readdir
рдХреЛ getStaticProps
рдФрд░ getStaticPaths
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрдВрджрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдХреЛрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, fs
рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╢реАрд░реНрд╖ рдкрд░ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@borispoehland рдЕрджреНрднреБрдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ path.resolve()
рд╕реЗ /public
рд╕реНрдерд╛рдиреАрдп рдФрд░ рд╡рд░реНрд╕реЗрд▓ рджреЛрдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛: рдЖрдВрдЦреЗрдВ:! рдЖрдк рджрд┐рди рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рддрд╛рд░рдгрд╣рд╛рд░ рд╣реИрдВред :+1:
@borispoehland рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
ENOENT: рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВ, '/var/task/public/posts.json' рдЦреЛрд▓реЗрдВ
const postsFile = resolve('./public/posts.json');
const updateCache = async (posts: IPost[]): Promise<IPost[]> => {
postCache = posts;
fs.writeFileSync(postsFile, JSON.stringify(postCache)); // <====
return postCache;
}
рдореИрдВрдиреЗ рдЕрдЧрд▓реЗ рдХреЗ рдмрд┐рдирд╛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред config.js
module.exports = {
serverRuntimeConfig: {
PROJECT_ROOT: __dirname
}
}
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рди рдХрд░реЗ?
@borispoehland рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
ENOENT: рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВ, '/var/task/public/posts.json' рдЦреЛрд▓реЗрдВconst postsFile = resolve('./public/posts.json'); const updateCache = async (posts: IPost[]): Promise<IPost[]> => { postCache = posts; fs.writeFileSync(postsFile, JSON.stringify(postCache)); // <==== return postCache; }
рдореИрдВрдиреЗ рдЕрдЧрд▓реЗ рдХреЗ рдмрд┐рдирд╛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред config.js
module.exports = { serverRuntimeConfig: { PROJECT_ROOT: __dirname } }
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рди рдХрд░реЗ?
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рдУрд░ рд╕реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛... рдХреНрд╖рдорд╛ рдХрд░реЗрдВ
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ @bengrunfeld рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЖрдк рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
[рддреНрд░реБрдЯрд┐: EROFS: рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, '/var/task/public/posts.json' рдЦреЛрд▓реЗрдВ]
рддреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ :(
@necaros рдХреНрдпрд╛ рдЖрдкрдиреЗ .json
рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .jpg
рдлрд╝рд╛рдЗрд▓?
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ @bengrunfeld рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЖрдк рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
[рддреНрд░реБрдЯрд┐: EROFS: рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, '/var/task/public/posts.json' рдЦреЛрд▓реЗрдВ]
рддреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ :(
@necaros рдЖрдкрдХреЛ S3 (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп, рдмрд╛рд╣рд░реА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо) рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рддреНрд╡рд░рд┐рдд, рдХреИрд╢реНрдб рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд░реЗрдбрд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред https://redislabs.com рдЗрд╕реЗ "рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд" рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдореБрдЭреЗ https://nextjs-boilerplates.brn.sh рдореЗрдВ рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓ рдЧрдП рд╣реИрдВред
@borispoehland рдореИрдВ рдкрдврд╝ рд╕рдХрддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛рд╣реАрди рдХрд╛рд░реНрдп рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдирдИ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдмрд┐рд▓реНрдб (рдкреБрди: рд╕рддреНрдпрд╛рдкрд┐рдд) рдореЗрдВ рдЕрдкрдиреЗ рдХреИрд╢ рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмреБрд░рд╛ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
@ рдмреНрд░реВрдиреЛрдмрд░реНрдирд╛рд░реНрдбрд┐рдиреЛ рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдПрдХ рдирдЬрд╝рд░
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрдХреНрдд рд╢реМрдХрд┐рдпрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЯреВрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ :)
рдЙрд╕ рдХреА рдирдХрд▓ рдХрд░реЗрдВред рд░реЗрдбрд┐рд╕рд▓реИрдмреНрд╕ рдФрд░ рд╡рд░реНрд╕реЗрд▓ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд┐рдпрд╛ред рдореИрдВ
рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓ рдЧрдИрдВ ...
import { tmpdir } from "os";
const doc = new PDFDocument()
const pdfPath = path.join(tmpdir(), `${store.id}${moment().format('YYYYMMDD')}.pdf`)
const writeStream = doc.pipe(fs.createWriteStream(pdfPath)
рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ @subwaymatch рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
const logoPath = path.resolve('./public/logo.png')
рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓ рдЧрдИрдВ ...
import { tmpdir } from "os"; const doc = new PDFDocument() const pdfPath = path.join(tmpdir(), `${store.id}${moment().format('YYYYMMDD')}.pdf`) const writeStream = doc.pipe(fs.createWriteStream(pdfPath)
рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ @subwaymatch рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
const logoPath = path.resolve('./public/logo.png')
рдмрдврд╝рд┐рдпрд╛, рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ? рдХреНрдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реБрд▓рдн рдФрд░ рд╕реНрдерд╛рдпреА рд╣реИ?
@marklundin tmpdir
рдирд╛рдордХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд╛рдпреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ tmpdir
рдХрд┐рддрдирд╛ рдЕрд╕реНрдерд╛рдпреА рд╣реИ, рд╣рд╛рдБ ...
рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ getInitialProps рдореЗрдВ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдирд╣реАрдВ ЁЯд╖тАНтЩВя╕П
рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди
const data = await import(`../../../../data/de/my-nice-file.json`);
res.json(data.default);
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ
рдпрд╣рд╛рдВ рдХреБрдЫ рдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ?
рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдЧрд╛рдЗрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╣реА рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд-рдХреЛрдб рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╡рд┐рдзрд┐ fs рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдХ рдХреА jsx рдлрд╝рд╛рдЗрд▓ рдХреЛ getServerSideProps рдХреЗ рдЕрдВрджрд░ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХреЛ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реА рд╣реИред
рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд╛рдБрдж рдкрд░ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЬрдм рдореИрдВ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдЧрдпрд╛, рддреЛ рдЦреБрд╢реА рдЪрд▓реА рдЧрдИ :(
рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ: https://github.com/ElGoorf/i18next-guide/blob/fix-example-components/pages/plurals.jsx
@ElGoorf рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ public
рдлрд╛рдЗрд▓реЗрдВ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд▓реИрдореНрдмреНрдбрд╛ рдкрд░ рд╣реИрдВред рдЕрдм, @vercel/next
рдЕрднреА рднреА includeFiles
рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде lambda
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдВ рдХреБрдЫ рдирдореВрдирд╛ рдХреЛрдб рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдпрд╣рд╛рдВ рджреВрд╕рд░реЛрдВ рдХреА рдорджрдж рдХреА: https://github.com/vercel/next.js/issues/8251#issuecomment -614220305
рдзрдиреНрдпрд╡рд╛рдж @ рдмреНрд░реВрдиреЛрдмрд░реНрдирд╛рд░реНрдбрд┐рдиреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ "рдПрдХреНрд╕ рдЫрд┐рдкреА рд╣реБрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ ..." рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЕрд░реНрде рдЦреЛрдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВ!
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реИ рдЬрдм рдореИрдВрдиреЗ рдПрдЬ/рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ @balthild рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рдХрд░реАрдм рдерд╛ рдЬреЛ рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ node.fs рд╡рд┐рдзрд┐ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдерд╛: https:/ /github.com/vercel/next.js/issues/8251#issuecomment -634829189
рдорд╣рд╛рди! рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рдХрд╛рдо рдорд┐рд▓ рдЧрдпрд╛? рдпрд╛ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ?
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд░реНрд╕реЗрд▓ рднреА рдЙрд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдЬ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╕реАрдбреАрдПрди рд╕реЗ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЗрдВ рдкрд░реЛрд╕реА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ "рдмреИрдХрдПрдВрдб" рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рд╕реЗ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддрд░рд╣ рдЕрд▓рдЧ-рдерд▓рдЧ рд╣реИрдВ .
рдЕрд░реЗ,
vercel рдкрд░ next.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдореИрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдБред const logoPath = path.resolve('./public/logo.png')
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдореИрдВ public/sitemap.xml рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ (vercel рдкрд░ рдЖрдХрд╛рд░ рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг) рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕рд╛рдЗрдЯрдореИрдк рдХреЛ zlib рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред рдпрд╣ рдЖрдХрд╛рд░ рд╕реАрдорд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВред рд╕рд╛рдЗрдЯрдореИрдк рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХрд╛ рдореИрдВрдиреЗ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ:
рдЕрд░реЗ @emomooney , рдореИрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рд╡рд░реНрд╕реЗрд▓ рдХрднреА рднреА рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдХрд╛ рдореБрдЦреНрдп "рд▓рд╛рдн" рдЗрд╕рдХреА рд╕реНрдЯреЗрдЯрд▓реЗрд╕рдиреЗрд╕ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдЗрд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдЬреБрдбрд╝ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд░реЗрдВрдЧреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдирд╛рд░реЗ/рд╕реАрдбреАрдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕рд╛рдЗрдЯрдореИрдк рдХреЛ zlib рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред
рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдмрд╛рдж рдХреА рдХреЙрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреАрдореЗрдкрди рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рдереЗ, рдпрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ, рдардВрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Vercel рдХреЛ next.js api рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ API рдХреЙрд▓ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдХрд░рддрд╛ рд╣реВрдВ ред
рдпрджрд┐ рдпрд╣ рдерд╛ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХрд╛ "рдЕрд▓рдЧ рдмреИрдХрдПрдВрдб" рд╡рд░реНрд╕реЗрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ sitemap.xml
рдлрд╝рд╛рдЗрд▓ рдФрд░ vercel --prod
рдХреЛ рдПрдХ рдбреЛрдореЗрди рдореЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕реБрд▓рдн рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП "рдХреИрд╢рд┐рдВрдЧ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╕рд╛рдЗрдЯрдореИрдк рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЛрдореЗрди/рдЙрдкрдбреЛрдореЗрди рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП robots.txt
ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
рдФрд░ рд╕реНрдерд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдмрд╣реБрдд рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (
/public/images
рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛)ред