buildNodeModules icon indicating copy to clipboard operation
buildNodeModules copied to clipboard

An experiment in improving node packaging for nix. Dead simple.

buildNodeModules

The dumbest node to Nix packaging solution yet!

How it works

How node_modules is built

  • Map over package-lock.json packages, invoke correct fetcher

  • Update package.json & package-lock.lock to point to store paths URLs are rewritten to file:... dependencies that link to the Nix store.

  • Run npm install

How node_modules is linked

Our configure/shell hook links individual directories inside the Nix built node_modules directory. This is to work around issues like https://github.com/nix-community/npmlock2nix/issues/86 and that tools like vite expects a writable node_modules.

Usage

  • default.nix
stdenv.mkDerivation {
  pname = "my-website";
  version = "0.1.0";

  src = ./.;

  nativeBuildInputs = [
    buildNodeModules.hooks.npmConfigHook
    nodejs
    nodejs.passthru.python # for node-gyp
    npmHooks.npmBuildHook
    npmHooks.npmInstallHook
  ];

  nodeModules = buildNodeModules.fetchNodeModules {
    packageRoot = ./.;
  };
}
  • shell.nix
pkgs.mkShell {
  packages = [
    buildNodeModules.hooks.linkNodeModulesHook
    nodejs
  ];

  nodeModules = buildNodeModules.buildNodeModules {
    packageRoot = ./.;
    inherit nodejs;
  };
}