vitejs / vite

Next generation frontend tooling. It's fast!
http://vitejs.dev
MIT License
65.93k stars 5.88k forks source link

Segmentation fault when building sveltekit library with dependency using FFI #17544

Open TimoGlastra opened 1 week ago

TimoGlastra commented 1 week ago

Describe the bug

When I try to build my sveltekit project using SSR, and including @hyperledger/aries-askar-nodejs, which uses FFI the project errors with a segmentation fault. It is not clear what is going wrong, or why it is erroring.

When I remove the import of this library the segmentation fault disappears. I've tried excluding the library from being packages in all ways possible (with optimizeDeps, external, etc..), but nothing seems to work.

Reproduction

https://github.com/TimoGlastra/sveltekit-askar-bug

Steps to reproduce

run pnpm install and then pnpm build

System Info

System:
    OS: macOS 14.1.2
    CPU: (10) arm64 Apple M1 Pro
    Memory: 82.47 MB / 16.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 20.11.1 - ~/.nvm/versions/node/v20.11.1/bin/node
    Yarn: 1.22.22 - ~/.nvm/versions/node/v20.11.1/bin/yarn
    npm: 10.2.4 - ~/.nvm/versions/node/v20.11.1/bin/npm
    pnpm: 9.4.0 - ~/.nvm/versions/node/v20.11.1/bin/pnpm
    bun: 1.0.6 - ~/.bun/bin/bun
    Watchman: 2024.04.15.00 - /opt/homebrew/bin/watchman
  Browsers:
    Brave Browser: 125.1.66.118
    Chrome: 126.0.6478.63
    Safari: 17.1.2
  npmPackages:
    vite: ^5.0.3 => 5.3.1

Used Package Manager

pnpm

Logs

Click to expand! ```shell > vite build "--debug" vite:config bundled config file loaded in 385.68ms +0ms vite:config using resolved config: { vite:config plugins: [ vite:config 'vite:build-metadata', vite:config 'vite:watch-package-data', vite:config 'vite:pre-alias', vite:config 'alias', vite:config 'vite-plugin-svelte', vite:config 'vite:modulepreload-polyfill', vite:config 'vite:resolve', vite:config 'vite:html-inline-proxy', vite:config 'vite:css', vite:config 'vite:esbuild', vite:config 'vite:json', vite:config 'vite:wasm-helper', vite:config 'vite:worker', vite:config 'vite:asset', vite:config 'vite-plugin-sveltekit-setup', vite:config 'vite-plugin-sveltekit-virtual-modules', vite:config 'vite-plugin-sveltekit-guard', vite:config 'vite-plugin-sveltekit-compile', vite:config 'vite:wasm-fallback', vite:config 'vite:define', vite:config 'vite:css-post', vite:config 'vite:build-html', vite:config 'vite:worker-import-meta-url', vite:config 'vite:asset-import-meta-url', vite:config 'vite:force-systemjs-wrap-complete', vite:config 'commonjs', vite:config 'vite:data-uri', vite:config 'vite:dynamic-import-vars', vite:config 'vite:import-glob', vite:config 'vite:build-import-analysis', vite:config 'vite:esbuild-transpile', vite:config 'vite:manifest', vite:config 'vite:reporter', vite:config 'vite:load-fallback' vite:config ], vite:config ssr: { vite:config target: 'node', vite:config external: [ '@hyperledger/aries-askar-nodejs' ], vite:config noExternal: [ 'svelte', /^svelte\//, 'esm-env', '@sveltejs/kit' ], vite:config optimizeDeps: { noDiscovery: true, esbuildOptions: [Object] } vite:config }, vite:config build: { vite:config target: 'node18.13', vite:config cssTarget: 'node18.13', vite:config outDir: '/Users/timo/sveltekit-askar-bug/.svelte-kit/output/server', vite:config assetsDir: 'assets', vite:config assetsInlineLimit: 4096, vite:config cssCodeSplit: true, vite:config sourcemap: false, vite:config rollupOptions: { vite:config input: [Object], vite:config output: [Object], vite:config preserveEntrySignatures: 'strict' vite:config }, vite:config minify: false, vite:config terserOptions: {}, vite:config write: true, vite:config emptyOutDir: null, vite:config copyPublicDir: false, vite:config manifest: '.vite/manifest.json', vite:config lib: false, vite:config ssr: true, vite:config ssrManifest: false, vite:config ssrEmitAssets: true, vite:config reportCompressedSize: true, vite:config chunkSizeWarningLimit: 500, vite:config watch: null, vite:config cssMinify: true, vite:config commonjsOptions: { include: [Array], extensions: [Array] }, vite:config dynamicImportVarsOptions: { warnOnError: true, exclude: [Array] }, vite:config modulePreload: { polyfill: true } vite:config }, vite:config resolve: { vite:config mainFields: [ 'svelte', 'browser', 'module', 'jsnext:main', 'jsnext' ], vite:config conditions: [ 'svelte' ], vite:config extensions: [ vite:config '.mjs', '.js', vite:config '.mts', '.ts', vite:config '.jsx', '.tsx', vite:config '.json' vite:config ], vite:config dedupe: [ vite:config 'svelte/animate', vite:config 'svelte/easing', vite:config 'svelte/internal', vite:config 'svelte/internal/disclose-version', vite:config 'svelte/motion', vite:config 'svelte/ssr', vite:config 'svelte/store', vite:config 'svelte/transition', vite:config 'svelte', vite:config 'svelte-hmr/runtime/hot-api-esm.js', vite:config 'svelte-hmr/runtime/proxy-adapter-dom.js', vite:config 'svelte-hmr' vite:config ], vite:config preserveSymlinks: false, vite:config alias: [ [Object], [Object], [Object], [Object], [Object] ] vite:config }, vite:config optimizeDeps: { vite:config holdUntilCrawlEnd: true, vite:config include: [ vite:config 'svelte/animate', vite:config 'svelte/easing', vite:config 'svelte/internal', vite:config 'svelte/internal/disclose-version', vite:config 'svelte/motion', vite:config 'svelte/store', vite:config 'svelte/transition', vite:config 'svelte' vite:config ], vite:config exclude: [ 'svelte-hmr', '@sveltejs/kit', '$app', '$env' ], vite:config entries: [ vite:config '/Users/timo/sveltekit-askar-bug/src/routes/**/+*.{svelte,js,ts}', vite:config '!/Users/timo/sveltekit-askar-bug/src/routes/**/+*server.*' vite:config ], vite:config esbuildOptions: { preserveSymlinks: false } vite:config }, vite:config experimental: { importGlobRestoreExtension: false, hmrPartialAccept: true }, vite:config root: '/Users/timo/sveltekit-askar-bug', vite:config server: { vite:config preTransformRequests: true, vite:config cors: { preflightContinue: true }, vite:config fs: { vite:config strict: true, vite:config allow: [Array], vite:config deny: [Array], vite:config cachedChecks: undefined vite:config }, vite:config sourcemapIgnoreList: [Function: sourcemapIgnoreList], vite:config watch: { ignored: [Array] }, vite:config middlewareMode: false vite:config }, vite:config preview: { vite:config port: undefined, vite:config strictPort: undefined, vite:config host: undefined, vite:config https: undefined, vite:config open: undefined, vite:config proxy: undefined, vite:config cors: { preflightContinue: true }, vite:config headers: undefined vite:config }, vite:config define: { vite:config __SVELTEKIT_ADAPTER_NAME__: '"@sveltejs/adapter-auto"', vite:config __SVELTEKIT_APP_VERSION_FILE__: '"_app/version.json"', vite:config __SVELTEKIT_APP_VERSION_POLL_INTERVAL__: '0', vite:config __SVELTEKIT_DEV__: 'false', vite:config __SVELTEKIT_EMBEDDED__: 'false' vite:config }, vite:config base: '/', vite:config publicDir: '/Users/timo/sveltekit-askar-bug/static', vite:config worker: { vite:config format: 'iife', vite:config plugins: '() => plugins', vite:config rollupOptions: { output: [Object] } vite:config }, vite:config configFile: '/Users/timo/sveltekit-askar-bug/vite.config.ts', vite:config configFileDependencies: [ '/Users/timo/sveltekit-askar-bug/vite.config.ts' ], vite:config inlineConfig: { vite:config root: undefined, vite:config base: undefined, vite:config mode: undefined, vite:config configFile: undefined, vite:config logLevel: undefined, vite:config clearScreen: undefined, vite:config build: {} vite:config }, vite:config rawBase: '/', vite:config cacheDir: '/Users/timo/sveltekit-askar-bug/node_modules/.vite', vite:config command: 'build', vite:config mode: 'production', vite:config isWorker: false, vite:config mainConfig: null, vite:config bundleChain: [], vite:config isProduction: true, vite:config css: { lightningcss: undefined }, vite:config esbuild: { jsxDev: false }, vite:config envDir: '/Users/timo/sveltekit-askar-bug', vite:config env: { BASE_URL: '/', MODE: 'production', DEV: false, PROD: true }, vite:config assetsInclude: [Function: assetsInclude], vite:config logger: { vite:config hasWarned: false, vite:config info: [Function: info], vite:config warn: [Function: warn], vite:config warnOnce: [Function: warnOnce], vite:config error: [Function: error], vite:config clearScreen: [Function: clearScreen], vite:config hasErrorLogged: [Function: hasErrorLogged] vite:config }, vite:config packageCache: Map(1) { vite:config 'fnpd_/Users/timo/sveltekit-askar-bug' => { vite:config dir: '/Users/timo/sveltekit-askar-bug', vite:config data: [Object], vite:config hasSideEffects: [Function: hasSideEffects], vite:config webResolvedImports: {}, vite:config nodeResolvedImports: {}, vite:config setResolvedCache: [Function: setResolvedCache], vite:config getResolvedCache: [Function: getResolvedCache] vite:config }, vite:config set: [Function (anonymous)] vite:config }, vite:config createResolver: [Function: createResolver], vite:config appType: 'spa', vite:config getSortedPlugins: [Function: getSortedPlugins], vite:config getSortedPluginHooks: [Function: getSortedPluginHooks] vite:config } +58ms vite v5.3.1 building SSR bundle for production... ✓ 91 modules transformed. vite:config bundled config file loaded in 4.03ms +652ms vite:config using resolved config: { vite:config plugins: [ vite:config 'vite:build-metadata', vite:config 'vite:watch-package-data', vite:config 'vite:pre-alias', vite:config 'alias', vite:config 'vite-plugin-svelte', vite:config 'vite:modulepreload-polyfill', vite:config 'vite:resolve', vite:config 'vite:html-inline-proxy', vite:config 'vite:css', vite:config 'vite:esbuild', vite:config 'vite:json', vite:config 'vite:wasm-helper', vite:config 'vite:worker', vite:config 'vite:asset', vite:config 'vite-plugin-sveltekit-setup', vite:config 'vite-plugin-sveltekit-virtual-modules', vite:config 'vite-plugin-sveltekit-guard', vite:config 'vite-plugin-sveltekit-compile', vite:config 'vite:wasm-fallback', vite:config 'vite:define', vite:config 'vite:css-post', vite:config 'vite:build-html', vite:config 'vite:worker-import-meta-url', vite:config 'vite:asset-import-meta-url', vite:config 'vite:force-systemjs-wrap-complete', vite:config 'commonjs', vite:config 'vite:data-uri', vite:config 'vite:dynamic-import-vars', vite:config 'vite:import-glob', vite:config 'vite:build-import-analysis', vite:config 'vite:esbuild-transpile', vite:config 'vite:terser', vite:config 'vite:manifest', vite:config 'vite:reporter', vite:config 'vite:load-fallback' vite:config ], vite:config ssr: { vite:config target: 'node', vite:config external: [ '@hyperledger/aries-askar-nodejs' ], vite:config noExternal: [ 'svelte', /^svelte\//, 'esm-env', '@sveltejs/kit' ], vite:config optimizeDeps: { noDiscovery: true, esbuildOptions: [Object] } vite:config }, vite:config configFile: '/Users/timo/sveltekit-askar-bug/vite.config.ts', vite:config mode: 'production', vite:config build: { vite:config target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], vite:config cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], vite:config outDir: '/Users/timo/sveltekit-askar-bug/.svelte-kit/output/client', vite:config assetsDir: 'assets', vite:config assetsInlineLimit: 4096, vite:config cssCodeSplit: true, vite:config sourcemap: false, vite:config rollupOptions: { vite:config input: [Object], vite:config output: [Object], vite:config preserveEntrySignatures: 'strict' vite:config }, vite:config minify: 'esbuild', vite:config terserOptions: {}, vite:config write: true, vite:config emptyOutDir: null, vite:config copyPublicDir: true, vite:config manifest: '.vite/manifest.json', vite:config lib: false, vite:config ssr: false, vite:config ssrManifest: false, vite:config ssrEmitAssets: true, vite:config reportCompressedSize: true, vite:config chunkSizeWarningLimit: 500, vite:config watch: null, vite:config cssMinify: true, vite:config commonjsOptions: { include: [Array], extensions: [Array] }, vite:config dynamicImportVarsOptions: { warnOnError: true, exclude: [Array] }, vite:config modulePreload: { polyfill: true } vite:config }, vite:config optimizeDeps: { vite:config holdUntilCrawlEnd: true, vite:config force: undefined, vite:config include: [ vite:config 'svelte/animate', vite:config 'svelte/easing', vite:config 'svelte/internal', vite:config 'svelte/internal/disclose-version', vite:config 'svelte/motion', vite:config 'svelte/store', vite:config 'svelte/transition', vite:config 'svelte' vite:config ], vite:config exclude: [ 'svelte-hmr', '@sveltejs/kit', '$app', '$env' ], vite:config entries: [ vite:config '/Users/timo/sveltekit-askar-bug/src/routes/**/+*.{svelte,js,ts}', vite:config '!/Users/timo/sveltekit-askar-bug/src/routes/**/+*server.*' vite:config ], vite:config esbuildOptions: { preserveSymlinks: false } vite:config }, vite:config resolve: { vite:config mainFields: [ 'svelte', 'browser', 'module', 'jsnext:main', 'jsnext' ], vite:config conditions: [ 'svelte' ], vite:config extensions: [ vite:config '.mjs', '.js', vite:config '.mts', '.ts', vite:config '.jsx', '.tsx', vite:config '.json' vite:config ], vite:config dedupe: [ vite:config 'svelte/animate', vite:config 'svelte/easing', vite:config 'svelte/internal', vite:config 'svelte/internal/disclose-version', vite:config 'svelte/motion', vite:config 'svelte/ssr', vite:config 'svelte/store', vite:config 'svelte/transition', vite:config 'svelte', vite:config 'svelte-hmr/runtime/hot-api-esm.js', vite:config 'svelte-hmr/runtime/proxy-adapter-dom.js', vite:config 'svelte-hmr' vite:config ], vite:config preserveSymlinks: false, vite:config alias: [ [Object], [Object], [Object], [Object], [Object] ] vite:config }, vite:config experimental: { importGlobRestoreExtension: false, hmrPartialAccept: true }, vite:config root: '/Users/timo/sveltekit-askar-bug', vite:config server: { vite:config preTransformRequests: true, vite:config cors: { preflightContinue: true }, vite:config fs: { vite:config strict: true, vite:config allow: [Array], vite:config deny: [Array], vite:config cachedChecks: undefined vite:config }, vite:config sourcemapIgnoreList: [Function: sourcemapIgnoreList], vite:config watch: { ignored: [Array] }, vite:config middlewareMode: false vite:config }, vite:config preview: { vite:config port: undefined, vite:config strictPort: undefined, vite:config host: undefined, vite:config https: undefined, vite:config open: undefined, vite:config proxy: undefined, vite:config cors: { preflightContinue: true }, vite:config headers: undefined vite:config }, vite:config define: { vite:config __SVELTEKIT_ADAPTER_NAME__: '"@sveltejs/adapter-auto"', vite:config __SVELTEKIT_APP_VERSION_FILE__: '"_app/version.json"', vite:config __SVELTEKIT_APP_VERSION_POLL_INTERVAL__: '0', vite:config __SVELTEKIT_DEV__: 'false', vite:config __SVELTEKIT_EMBEDDED__: 'false' vite:config }, vite:config base: './', vite:config publicDir: '/Users/timo/sveltekit-askar-bug/static', vite:config worker: { vite:config format: 'iife', vite:config plugins: '() => plugins', vite:config rollupOptions: { output: [Object] } vite:config }, vite:config configFileDependencies: [ '/Users/timo/sveltekit-askar-bug/vite.config.ts' ], vite:config inlineConfig: { vite:config configFile: '/Users/timo/sveltekit-askar-bug/vite.config.ts', vite:config mode: 'production', vite:config logLevel: undefined, vite:config clearScreen: undefined, vite:config build: { minify: undefined, assetsInlineLimit: 4096, sourcemap: false }, vite:config optimizeDeps: { force: undefined } vite:config }, vite:config rawBase: './', vite:config cacheDir: '/Users/timo/sveltekit-askar-bug/node_modules/.vite', vite:config command: 'build', vite:config isWorker: false, vite:config mainConfig: null, vite:config bundleChain: [], vite:config isProduction: true, vite:config css: { lightningcss: undefined }, vite:config esbuild: { jsxDev: false }, vite:config envDir: '/Users/timo/sveltekit-askar-bug', vite:config env: { BASE_URL: './', MODE: 'production', DEV: false, PROD: true }, vite:config assetsInclude: [Function: assetsInclude], vite:config logger: { vite:config hasWarned: false, vite:config info: [Function: info], vite:config warn: [Function: warn], vite:config warnOnce: [Function: warnOnce], vite:config error: [Function: error], vite:config clearScreen: [Function: clearScreen], vite:config hasErrorLogged: [Function: hasErrorLogged] vite:config }, vite:config packageCache: Map(1) { vite:config 'fnpd_/Users/timo/sveltekit-askar-bug' => { vite:config dir: '/Users/timo/sveltekit-askar-bug', vite:config data: [Object], vite:config hasSideEffects: [Function: hasSideEffects], vite:config webResolvedImports: {}, vite:config nodeResolvedImports: {}, vite:config setResolvedCache: [Function: setResolvedCache], vite:config getResolvedCache: [Function: getResolvedCache] vite:config }, vite:config set: [Function (anonymous)] vite:config }, vite:config createResolver: [Function: createResolver], vite:config appType: 'spa', vite:config getSortedPlugins: [Function: getSortedPlugins], vite:config getSortedPluginHooks: [Function: getSortedPluginHooks] vite:config } +4ms vite v5.3.1 building for production... ✓ 61 modules transformed. .svelte-kit/output/client/_app/version.json 0.03 kB │ gzip: 0.05 kB .svelte-kit/output/client/.vite/manifest.json 2.51 kB │ gzip: 0.50 kB .svelte-kit/output/client/_app/immutable/entry/start.B_g6I2LP.js 0.07 kB │ gzip: 0.08 kB .svelte-kit/output/client/_app/immutable/nodes/0.V07vbrzA.js 0.60 kB │ gzip: 0.39 kB .svelte-kit/output/client/_app/immutable/nodes/2.DYBzjjm4.js 0.69 kB │ gzip: 0.45 kB .svelte-kit/output/client/_app/immutable/nodes/1.CGDxFk9d.js 1.02 kB │ gzip: 0.60 kB .svelte-kit/output/client/_app/immutable/chunks/scheduler.BvLojk_z.js 2.16 kB │ gzip: 1.02 kB .svelte-kit/output/client/_app/immutable/chunks/index.DFTQtrJW.js 5.43 kB │ gzip: 2.30 kB .svelte-kit/output/client/_app/immutable/entry/app.1jM0tJAr.js 6.02 kB │ gzip: 2.44 kB .svelte-kit/output/client/_app/immutable/chunks/entry.CMABNftM.js 27.42 kB │ gzip: 10.83 kB ✓ built in 237ms .svelte-kit/output/server/.vite/manifest.json 2.59 kB .svelte-kit/output/server/entries/pages/_page.server.ts.js 0.16 kB .svelte-kit/output/server/entries/fallbacks/layout.svelte.js 0.24 kB .svelte-kit/output/server/internal.js 0.31 kB .svelte-kit/output/server/entries/pages/_page.svelte.js 0.37 kB .svelte-kit/output/server/entries/fallbacks/error.svelte.js 1.16 kB .svelte-kit/output/server/chunks/ssr.js 3.34 kB .svelte-kit/output/server/chunks/exports.js 5.94 kB .svelte-kit/output/server/chunks/internal.js 6.00 kB .svelte-kit/output/server/index.js 115.01 kB ✓ built in 1.18s Run npm run preview to preview your production build locally. > Using @sveltejs/adapter-auto Could not detect a supported production environment. See https://kit.svelte.dev/docs/adapters to learn how to configure your app to run on the platform of your choosing ✔ done [1] 80346 segmentation fault pnpm build --debug ```

Validations

TimoGlastra commented 1 week ago

Upon further debugging I found it will throw the segmentation fault when node-gyp-build is loaded during build. So it seems to actually execute the code during build and try to load the native binary.

So I think the main issue is, why the ssr.external is not being picked up, and ignoring the import of @hypereldger/aries-askar-nodejs during build. Ideally it just keeps the reference to that package, and it needs to be installed in node_modules when you want to run the server.