You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript导入在Nix构建中失败却在Nix开发shell中成功?

问题:Nix构建Node.js项目失败但开发shell中正常运行

目标

我想要通过以下命令运行generate.js,利用d3.js生成SVG文件:

$ nix build 'github:MatrixManAtYrService/buildsvg#svg'
$ ls result
    output.svg

仓库中的flake.nix配置

仓库的flake.nix中包含如下输出派生:

packages.svg = pkgs.stdenv.mkDerivation rec {
  name = "generate-svg";
  src = self;
  buildInputs = [ pkgs.nodePackages.nodejs ];
  buildPhase = ''
    export NODE_PATH=${src}/node_modules
    node ${src}/generate.js
  '';

  installPhase = ''
    mkdir -p $out
    cp output.svg $out/
  '';
};

构建时的错误信息

执行nix build时,node命令报错退出:

Error: Cannot find package '/nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/node_modules/opentype.js/package.json' imported from /nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/generate.js
    at legacyMainResolve (node:internal/modules/esm/resolve:215:26)
    at packageResolve (node:internal/modules/esm/resolve:841:14)
    at moduleResolve (node:internal/modules/esm/resolve:927:18)
    at defaultResolve (node:internal/modules/esm/resolve:1157:11)
    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:390:12)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:359:25)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:234:38)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:87:39)
    at link (node:internal/modules/esm/module_job:86:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}
Node.js v20.12.2

generate.js的导入代码

generate.js的开头部分如下,错误发生在导入opentype.js的行:

import fs from 'fs';
import * as d3 from 'd3';
import opentype from 'opentype.js';  // <--- 错误发生在此处
import D3Node from 'd3-node';

开发shell中可正常运行

仓库的flake.nix中配置了开发shell:

devShells.default = pkgs.mkShell {
  buildInputs = [
    pkgs.nodePackages.nodejs
  ];
  shellHook = ''
    export NODE_PATH=$PWD/node_modules
  '';
};

在开发shell中运行generate.js完全正常:

$ nix develop
$ node generate.js
SVG generated successfully.

补充信息

  • package.json已声明所有相关依赖,且已执行npm install将依赖下载到本地node_modules目录
  • 我在buildPhase中添加了ls命令验证,确认/nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/node_modules/opentype.js/package.json确实存在

疑问

为什么同样的操作在Nix构建过程中失败,但在Nix开发shell中却能成功运行?


内容的提问来源于stack exchange,提问作者MatrixManAtYrService

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:43:09