Next.js: Next.js рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ (рдФрд░ рдкреГрд╖реНрдареЛрдВ) рдХреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдЕрдЧре░ 2019  ┬╖  87рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vercel/next.js

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЗрдЦ рдорд╛рдВрдЧрдирд╛

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ? рдХреГрдкрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдмрддрд╛рдПрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ 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 рд╕рд╛рде рдзреЛрдЦрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдореИрдВ

story feature request

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

# 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 рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛)ред

рд╕рднреА 87 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдмрд╕ рдЗрд╕реЗ рджреВрд╕рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕реЗ рдПрд╕ 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_ рдкреНрд░рд╢реНрди рд╣реИрдВ

  1. рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреЗрдЯрд╛-рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ? (рдмрд╛рд╣рд░/рдЕрдВрджрд░ src ?)
  2. рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдЧрд▓рд╛.js рдкреГрд╖реНрда рдШрдЯрдХ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
  3. рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдкрде рд╣реИ, рдпрд╛ рдЖрдк рдкрде рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
  4. рдирд┐рд░реНрдорд╛рдг/рддреИрдирд╛рддреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдпрд╣ рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдкрде рдирд╣реАрдВ рд╣реИ?

@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 рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдордп рд╣реЛ рддреЛ рдХреБрдЫ рдЕрдиреБрд╡рд░реНрддреА рдкреНрд░рд╢реНрди:

  1. рдЖрдк рдпрд╣рд╛рдБ рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕реНрдереИрддрд┐рдХ рд╕рд╛рдЗрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╣реИ? рдпрд╛рдиреА next export рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп?
  2. рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛ рд╣реИ, рдХрд┐ getStaticPaths рдкрде рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдЬреЛ рддрдм (рдЕрдЧрд▓реЗ рджреНрд╡рд╛рд░рд╛) рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП getStaticProps рдореЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдлреАрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
  3. рдХреНрдпрд╛ рдЖрдк getStaticProps рдмрд┐рдирд╛ getStaticPaths рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП?
  4. рдХреНрдпрд╛ рдЖрдк 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 рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ, рдмрд╕ рдПрдХ рдЦреБрд╢ рдЧреНрд░рд╛рд╣рдХ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдЧреНрд░рд╛рд╣рдХ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЙрд╕ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:

  1. рдЖрдк рдЖрдзрд╛рд░ рдкрде рдХреЗ рд▓рд┐рдП process.cwd() рдХреЗ рдмрдЬрд╛рдп рдмрд╕ рдХреБрдЫ рднреА рдирд╣реАрдВ рдпрд╛ __dirname рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ
  2. рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ NextApiRequest рдФрд░ NextApiResponse рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ @now/node" рд╕реЗ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рддреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ:
import { NowRequest, NowResponse } from '@now/node';
  1. рдЖрдк 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

https://blog-fs-demo.vercel.app/

@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 рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред рдпрд╣ рдЖрдХрд╛рд░ рд╕реАрдорд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВред рд╕рд╛рдЗрдЯрдореИрдк рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХрд╛ рдореИрдВрдиреЗ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ:

  • рдПрдХреНрд╕рдПрдордПрд▓ рдХреЛ рдЬрд╝рд┐рдк рдХрд░рдирд╛ рдФрд░ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░рдирд╛ - рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдзреАрдорд╛ред
  • рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕рд╛рдЗрдЯрдореИрдк рдмрдирд╛рдирд╛ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдЖрдХрд╛рд░ рд╕реАрдорд╛ рдХреЛ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИред
  • рдЖрдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ (рдХрд╛рд░реНрдп) рд╕реЗ рд╕реНрдерд┐рд░ xml рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛, рд▓реЗрдХрд┐рди рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВред
  • рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓реЗрдЦрди, рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓/рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓реЗрдЦрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛
  • "рдПрдкреАрдЖрдИ" рдлрд╝рдВрдХреНрд╢рди, рдЖрдХрд╛рд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╕реНрдерд┐рд░ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рд▓реМрдЯрдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • "рдкреГрд╖реНрда" getServerSideProp рдЖрдХрд╛рд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╕реНрдерд┐рд░ xml рдлрд╝рд╛рдЗрд▓ рд▓реМрдЯрд╛рдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗ?

рдЕрд░реЗ @emomooney , рдореИрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рд╡рд░реНрд╕реЗрд▓ рдХрднреА рднреА рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдХрд╛ рдореБрдЦреНрдп "рд▓рд╛рдн" рдЗрд╕рдХреА рд╕реНрдЯреЗрдЯрд▓реЗрд╕рдиреЗрд╕ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдЗрд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдЬреБрдбрд╝ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд░реЗрдВрдЧреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдирд╛рд░реЗ/рд╕реАрдбреАрдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕рд╛рдЗрдЯрдореИрдк рдХреЛ zlib рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдмрд╛рдж рдХреА рдХреЙрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреАрдореЗрдкрди рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рдереЗ, рдпрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ, рдардВрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Vercel рдХреЛ next.js api рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ API рдХреЙрд▓ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдХрд░рддрд╛ рд╣реВрдВ ред

рдпрджрд┐ рдпрд╣ рдерд╛ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХрд╛ "рдЕрд▓рдЧ рдмреИрдХрдПрдВрдб" рд╡рд░реНрд╕реЗрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ sitemap.xml рдлрд╝рд╛рдЗрд▓ рдФрд░ vercel --prod рдХреЛ рдПрдХ рдбреЛрдореЗрди рдореЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕реБрд▓рдн рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП "рдХреИрд╢рд┐рдВрдЧ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╕рд╛рдЗрдЯрдореИрдк рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЛрдореЗрди/рдЙрдкрдбреЛрдореЗрди рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП robots.txt ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

renatorib picture renatorib  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kenji4569 picture kenji4569  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

YarivGilad picture YarivGilad  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

knipferrc picture knipferrc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

formula349 picture formula349  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ