Next.js: рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛: 'fs' рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

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

рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ

рдореИрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдЦреЛрдЬ-рдЕрдк npm рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрддрд╛-рдкрде рд╣реИ ред locate-path рдХреЛ рдЗрд╕рдХреЗ рдХреЛрдб рдХреЗ рднреАрддрд░ fs рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬрдм рдореИрдВ рдЕрдкрдирд╛ рдРрдк рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ:

[ error ] ./node_modules/locate-path/index.js
Module not found: Can't resolve 'fs' in 'C:\...\node_modules\locate-path'
Could not find files for /index in .next/build-manifest.json
Promise { <pending> }
ModuleNotFoundError: Module not found: Error: Can't resolve 'fs' in 'C:\...\node_modules\locate-path'
    at factory.create (C:\...\node_modules\webpack\lib\Compilation.js:823:10)
    at factory (C:\...\node_modules\webpack\lib\NormalModuleFactory.js:397:22)
    at resolver (C:\...\node_modules\webpack\lib\NormalModuleFactory.js:130:21)
    at asyncLib.parallel (C:\...\node_modules\webpack\lib\NormalModuleFactory.js:224:22)
    at C:\...\node_modules\neo-async\async.js:2830:7
    at C:\...\node_modules\neo-async\async.js:6877:13
    at normalResolver.resolve (C:\...\node_modules\webpack\lib\NormalModuleFactory.js:214:25)
    at doResolve (C:\...\node_modules\enhanced-resolve\lib\Resolver.js:184:12)
    at hook.callAsync (C:\...\node_modules\enhanced-resolve\lib\Resolver.js:238:5)
    at _fn0 (eval at create (C:\...\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:15:1)
    at resolver.doResolve (C:\...\node_modules\enhanced-resolve\lib\UnsafeCachePlugin.js:37:5)
    at hook.callAsync (C:\...\node_modules\enhanced-resolve\lib\Resolver.js:238:5)
    at _fn0 (eval at create (C:\...\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:15:1)
    at hook.callAsync (C:\...\node_modules\enhanced-resolve\lib\Resolver.js:238:5)
    at _fn0 (eval at create (C:\...\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:27:1)
    at resolver.doResolve (C:\...\node_modules\enhanced-resolve\lib\DescriptionFilePlugin.js:42:38)

рдореИрдВрдиреЗ рдкрддрд╛-рдкрде рд░реЗрдкреЛ рдореЗрдВ рдПрдХ

рдкреНрд░рдЬрдирди рдХрд░рдирд╛

рдХреНрд▓реЛрди https://github.com/TidyIQ/nextjs-issue рдФрд░ npm run dev рдЪрд▓рд╛рдПрдВред

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

рдХреЛрдИ рд╣рд░рдЬ рдирд╣реАрдВ

рд╡реНрдпрд╡рд╕реНрдерд╛ рдЬрд╛рдирдХрд╛рд░реА

  • рдУрдПрд╕: рд╡рд┐рдВрдбреЛрдЬ 10
  • Next.js рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг: 8.1.1-рдХреИрдирд░реА.67

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

рдЖрдзреБрдирд┐рдХ Next.js рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ (9.4+)

рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ fs рдЙрдкрдпреЛрдЧ getStaticProps рдпрд╛ getServerSideProps , рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдЬреАрд╡рдирдЪрдХреНрд░ рдореЗрдВ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреЗрдбрд╝ рд╣рд┐рд▓ рдЬрд╛рдПред

рдЖрдк рдЗрд╕ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрддреНрд░рд╣реАрди рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА getInitialProps рд╕рд╛рде рдПрдХ рд╡рд┐рд░рд╛рд╕рддреА Next.js рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рдкрдврд╝реЗрдВ


рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ -- рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдХрднреА рднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧреА:

https://github.com/TidyIQ/nextjs-issue/blob/aef67b12d91d299d0978550005a40cbb34f74b71/pages/index.js#L5

рдпрд╛рдж рд░рдЦреЗрдВ, рдЖрдк рдХреЗрд╡рд▓ FS-рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЪрд╛рд▓рди _рдкрд░ рд╕рд░реНрд╡рд░_ рдХрд░рддреЗ рд╕рдордп рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп fs рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдпрджрд┐ рдЖрдк fs , рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ getInitialProps ред

рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдВрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде next.config.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:

module.exports = {
  webpack: (config, { isServer }) => {
    // Fixes npm packages that depend on `fs` module
    if (!isServer) {
      config.node = {
        fs: 'empty'
      }
    }

    return config
  }
}

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

рдЖрдзреБрдирд┐рдХ Next.js рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ (9.4+)

рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ fs рдЙрдкрдпреЛрдЧ getStaticProps рдпрд╛ getServerSideProps , рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдЬреАрд╡рдирдЪрдХреНрд░ рдореЗрдВ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреЗрдбрд╝ рд╣рд┐рд▓ рдЬрд╛рдПред

рдЖрдк рдЗрд╕ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрддреНрд░рд╣реАрди рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА getInitialProps рд╕рд╛рде рдПрдХ рд╡рд┐рд░рд╛рд╕рддреА Next.js рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рдкрдврд╝реЗрдВ


рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ -- рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдХрднреА рднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧреА:

https://github.com/TidyIQ/nextjs-issue/blob/aef67b12d91d299d0978550005a40cbb34f74b71/pages/index.js#L5

рдпрд╛рдж рд░рдЦреЗрдВ, рдЖрдк рдХреЗрд╡рд▓ FS-рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЪрд╛рд▓рди _рдкрд░ рд╕рд░реНрд╡рд░_ рдХрд░рддреЗ рд╕рдордп рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп fs рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдпрджрд┐ рдЖрдк fs , рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ getInitialProps ред

рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдВрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде next.config.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:

module.exports = {
  webpack: (config, { isServer }) => {
    // Fixes npm packages that depend on `fs` module
    if (!isServer) {
      config.node = {
        fs: 'empty'
      }
    }

    return config
  }
}

рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡реЗрдирд┐рд▓рд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдкрд░ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдиреЗрдХреНрд╕реНрдЯрдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ
https://github.com/zeit/next.js/tree/5787cbd9de33ea9add7cadeb04689b0d4b02976d/examples/blog-starter

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдХреЗрд╡рд▓ fs рдХрд╛ рдЙрдкрдпреЛрдЧ getStaticProps / getServerSideProps рдореЗрдВ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдбрд▓ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рдереАред рдЕрдЧрд░ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ fs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди getStaticProps рдХреЗ рдЕрдВрджрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд▓рд╛/рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдмрд╛рд░ рдЬрдм рдлрд╝рдВрдХреНрд╢рди getStaticProps рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрднрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдбрд▓ рдореЗрдВ рджрд┐рдЦрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЫрд┐рдкреЗ рд╣реБрдП рддрд░реНрдХ рд╣реИрдВ рдЬреЛ getStaticProps рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЖрдпрд╛рдд рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдирд┐рд░реНрдпрд╛рдд рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдХреБрдЫ рдШрдВрдЯреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдмрд┐рддрд╛рдП рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд╢рд╛рдпрдж рдбреЙрдХреНрд╕ рдореЗрдВ рдХрд╣реАрдВ рдПрдХ рд╕рд┐рдбреЗрдиреЛрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ :)

рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рддрд░реНрдХ рд╕рд┐рд░реНрдл рд╡реЗрдмрдкреИрдХ рдХрд╛ рдкреЗрдбрд╝ рдирд╣реАрдВ рд╣рд┐рд▓ рд░рд╣рд╛ рд╣реИ? рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЕрдЧрд▓рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдбрд▓ рдореЗрдВ getStaticProps рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реБрдЖ рддрд░реНрдХ рд╕рд┐рд░реНрдл рд╡реЗрдмрдкреИрдХ рдХрд╛ рдкреЗрдбрд╝ рдирд╣реАрдВ рд╣рд┐рд▓ рд░рд╣рд╛ рд╣реИ? рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЕрдЧрд▓рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдбрд▓ рдореЗрдВ getStaticProps рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред

рдирд╣реАрдВ, рд╡реЗрдмрдкреИрдХ рдЯреНрд░реА рд╢реЗрдХрд┐рдВрдЧ рдЗрддрдирд╛ рдкрд░рд┐рд╖реНрдХреГрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрди рдирд┐рд░реНрдпрд╛рддреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╣рд┐рд▓рд╛ рд╕рдХреЗред рдЯреНрд░реА рд╢реЗрдХрд┐рдВрдЧ getStaticProps / getServerSideProps / getStaticPaths рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЗрд╕ рдХрд╕реНрдЯрдо рдмреИрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/vercel/next.js/blob/canary/packages/next/build/babel/plugins/next-ssg-transform .ts

рдУрд╣ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ рд╣реИ :)

рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ _within_ getServerSideProps рд╕реЗ рд╣реЛ рд░рд╣рд╛ рд╣реЛрдЧрд╛?

рдирдорд╕реНрддреЗред @aloukissas рдХреА рддрд░рд╣ рдореЗрд░реЗ рдкрд╛рд╕ dotenv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореЗрд░реЗ index.js getStaticProps() рднреАрддрд░ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред next.config.js рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @Timer рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреЛрдИ рд╕реБрд░рд╛рдЧ? рдореИрдВ Next.js v.9.4.0 . рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реВрдВ

рдзрдиреНрдпрд╡рд╛рдж!

fast-glob рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реБрдИ

рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдореЗрдВ рдмрдВрдбрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдмреЗрд╣рддрд░реАрди рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдмрд╛рд╣рд░ рдирд┐рдХрд▓рд╛, рдореИрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдЪрд░ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ fast-glob рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ fs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ getStaticProps рдЕрдВрджрд░ рдХрд╣реАрдВ рднреА рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЗрдВ fast-glob рдЖрдпрд╛рдд рдХрд░рддреА рд╣реИрдВ

рдПрдХ рдЙрджрд╛рд╣рд░рдг:

mdxUtils.js

import glob from 'fast-glob'
import path from 'path'

export const BLOG_PATH = path.join(process.cwd(), 'posts')
export const blogFilePaths = glob.sync(`${BLOG_PATH}/blog/**/*.mdx`)

index.js

import { BLOG_PATH, blogFilePaths } from './mdxUtils'

export const getStaticProps = () => {
  const posts = blogFilePaths.map((filePath) => {
    ...
  }
  return { props: { posts } }
}

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ BLOG_PATH рдХрд╣реАрдВ рднреА index.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдХреЗрд╡рд▓ blogFilePaths рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдиреЗ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреАред

рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП тЖТ https://github.com/vercel/next.js/discussions/17138

рдзрдиреНрдпрд╡рд╛рдж @ deadcoder0904 рдпрд╣ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

import Layout from '../components/template'
import Main from '../components/main'
import Menu from '../components/menu'
import 'dotenv/config'

export async function getStaticProps () {
  const avatarLocation = process.env.AVATAR_URL
  const avatarTitle = process.env.AVATAR_TITLE

  return {
    props: {
      avatarLocation,
      avatarTitle
    }
  }
}

export default function RenderMainPage ({ avatarLocation, avatarTitle }) {
  return (
    <Layout
      avatarURL={avatarLocation}
      topLeft={<Menu />}
      middle={<Main avatarURL={avatarLocation} avatarTitle={avatarTitle} />}
    />
  )
}

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЯреВрд▓ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ import 'dotenv/config' рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рд╕рдВрднрд╡рдд: рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ env рдЪрд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ, рдореИрдВ рдЕрднреА рднреА Next.js рд╕реАрдЦ рд░рд╣рд╛ рд╣реВрдВ :)

@ ig-perez рдЕрдЧрд▓реЗ v9.4 рддрдХ, рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрд░реАрдХрд╛ рд╣реИ тЖТ https://nextjs.org/docs/basic-features/environment-variables

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗрдВ :)

рдпрд╣ рдХрдорд╛рд▓ рд╣реИ, рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЕрдкрдирд╛ рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛

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

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

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

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

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

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

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