Next.js: Modul tidak ditemukan: Tidak dapat menyelesaikan 'fs'

Dibuat pada 5 Jul 2019  ·  13Komentar  ·  Sumber: vercel/next.js

Laporan bug

Jelaskan bugnya

Saya menggunakan paket npm find-up populer, yang memiliki lokasi-jalur sebagai ketergantungan. locate-path membutuhkan fs dalam kodenya.

Ketika saya mencoba menjalankan aplikasi saya, saya mendapatkan pesan kesalahan berikut:

[ 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)

Saya membuat masalah di repo lokasi-jalur dan mereka telah mengonfirmasi bahwa masalahnya bukan pada mereka, tetapi kemungkinan dengan webpack. Saya tidak menggunakan webpack di aplikasi saya jadi masalahnya pasti timbul dari penggunaan webpack oleh Next.js.

Untuk Mereproduksi

Klon https://github.com/TidyIQ/nextjs-issue dan jalankan npm run dev .

Perilaku yang diharapkan

Tidak ada masalah

Sistem Informasi

  • OS: Windows 10
  • Versi Next.js: 8.1.1-canary.67

Komentar yang paling membantu

Pembaruan untuk Next.js modern (9.4+)

Anda dapat dengan aman menggunakan fs dalam getStaticProps atau getServerSideProps , tidak diperlukan konfigurasi tambahan . Pastikan Anda mereferensikan variabel dalam siklus hidup data Anda sehingga pohon diguncang dengan benar.

Anda dapat menggunakan alat ini untuk mempelajari cara kerjanya secara visual!

Jika Anda masih membangun versi Next.js lama dengan getInitialProps , baca di bawah


Kode yang diberikan tidak valid -- file ini tidak akan pernah tersedia di sisi klien selama rendering:

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

Ingat, Anda hanya dapat melakukan operasi terkait FS saat _di server_. Ini berarti Anda tidak dapat menggunakan fs saat merender.

Jika Anda menggunakan fs , pastikan itu hanya dalam getInitialProps .

Anda mungkin juga perlu membuat file next.config.js dengan konten berikut agar bundel klien dapat dibuat:

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

    return config
  }
}

Semua 13 komentar

Pembaruan untuk Next.js modern (9.4+)

Anda dapat dengan aman menggunakan fs dalam getStaticProps atau getServerSideProps , tidak diperlukan konfigurasi tambahan . Pastikan Anda mereferensikan variabel dalam siklus hidup data Anda sehingga pohon diguncang dengan benar.

Anda dapat menggunakan alat ini untuk mempelajari cara kerjanya secara visual!

Jika Anda masih membangun versi Next.js lama dengan getInitialProps , baca di bawah


Kode yang diberikan tidak valid -- file ini tidak akan pernah tersedia di sisi klien selama rendering:

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

Ingat, Anda hanya dapat melakukan operasi terkait FS saat _di server_. Ini berarti Anda tidak dapat menggunakan fs saat merender.

Jika Anda menggunakan fs , pastikan itu hanya dalam getInitialProps .

Anda mungkin juga perlu membuat file next.config.js dengan konten berikut agar bundel klien dapat dibuat:

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

    return config
  }
}

Saya memiliki masalah yang sama pada instalasi lokal saya yang praktis Vanilla, namun dalam contoh dari nextjs ini sepertinya tidak menjadi masalah
https://github.com/zeit/next.js/tree/5787cbd9de33ea9add7cadeb04689b0d4b02976d/examples/blog-starter

apa yang membuatnya berfungsi di sana tanpa memodifikasi file konfigurasi?

Hanya gunakan fs di getStaticProps / getServerSideProps karena itu dihilangkan dari bundel browser.

Saya menemukan apa masalahnya. Jika saya mengimpor fungsi yang menggunakan fs , tetapi tidak menjalankan/menggunakan fungsi di dalam getStaticProps, itu akan dimasukkan ke dalam bundel browser. Setelah fungsi direferensikan di dalam getStaticProps itu akan berhenti muncul di bundel browser.

Saya kira ada beberapa logika tersembunyi yang menghapus impor yang digunakan di getStaticProps tetapi tidak digunakan dalam ekspor utama. Saya menghabiskan beberapa jam men-debug sampai saya bisa mereproduksi, mungkin layak memiliki sidenote di suatu tempat di dokumen :)

Bukankah logika tersembunyi hanya pohon webpack yang bergetar? Masuk akal jika Anda memikirkannya, Next tidak mengimpor getStaticProps di bundel browser, jadi itu menghapus fungsi impor yang digunakan di dalamnya.

Jika Anda tidak mereferensikannya di mana pun, saya kira webpack menganggap Anda mengimpornya untuk efek samping, jadi itu masih menyertakannya di setiap bundel.

Bukankah logika tersembunyi hanya pohon webpack yang bergetar? Masuk akal jika Anda memikirkannya, Next tidak mengimpor getStaticProps di bundel browser, jadi itu menghapus fungsi impor yang digunakan di dalamnya.

Jika Anda tidak mereferensikannya di mana pun, saya kira webpack menganggap Anda mengimpornya untuk efek samping, jadi itu masih menyertakannya di setiap bundel.

Tidak, pengocokan pohon webpack tidak cukup canggih untuk mengguncang ekspor ini dengan cara itu. GetStaticProps / getServerSideProps / getStaticPaths yang bergetar ditangani oleh plugin Babel khusus yang kami buat: https://github.com/vercel/next.js/blob/canary/packages/next/build/babel/plugins/next-ssg-transform .ts

Oh terima kasih atas penunjuknya, sepertinya saya melebih-lebihkan webpack :)

Adakah alasan mengapa ini terjadi dari _within_ getServerSideProps ?

Halo semua. Seperti @aloukissas saya memiliki masalah yang sama ketika menggunakan dotenv dalam index.js getStaticProps() . Itu diselesaikan ketika menambahkan file next.config.js seperti yang ditunjukkan pada komentar awal @Timer .

Ada petunjuk mengapa ini terjadi? Saya menghapus Next.js v.9.4.0

Terima kasih!

Saya mengalami kesalahan ini saat menggunakan fast-glob .

Saya menggunakan alat hebat ini untuk memahami kode yang dibundel di sisi klien.

Ternyata, saya mengimpor variabel dari file yang menggunakan fast-glob yang secara internal menggunakan fs tetapi saya tidak menggunakan variabel di mana pun di dalam getStaticProps sehingga file mengimpor fast-glob tidak dihilangkan.

Sebuah contoh:

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 } }
}

Seperti yang Anda lihat, saya tidak menggunakan BLOG_PATH di mana pun di index.js tetapi masih mengimpornya. Saya hanya menggunakan blogFilePaths jadi itu memberi saya kesalahan ini.

Untuk konteks lebih lanjut → https://github.com/vercel/next.js/discussions/17138

Terima kasih @deadcoder0904 ini kode saya:

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} />}
    />
  )
}

Alat yang Anda sebutkan menunjukkan import 'dotenv/config' disertakan dalam kode klien, dan mungkin itu yang membuat kesalahan muncul. Masalahnya adalah saya membutuhkannya untuk membaca dari variabel env.

Mungkin ada cara lain yang lebih baik untuk melakukannya, saya masih belajar Next.js :)

@ig-perez Pada Next v9.4, mereka memiliki cara bawaan untuk memuat variabel lingkungan → https://nextjs.org/docs/basic-features/environment-variables

Saya sarankan Anda membaca dokumen untuk menemukan solusinya :)

Itu luar biasa, saya melewatkan bagian itu di dokumen, terima kasih! Saya akan memperbarui kode saya 👍🏽

Apakah halaman ini membantu?
0 / 5 - 0 peringkat