Fixing webpack vendor build in .NET Core web app template 2016-11-28

I’m currently working on a .NET Core single page application using the React Template for ASP.NET Core SPA Yeoman Generator, which worked great so far. However, after getting a fresh checkout, I started experiencing the error Cannot find module './wwwroot/dist/vendor-manifest.json' when starting up on top of IIS Express.

Turns out that this is because, by default, the wwwroot/dist directory is excluded from version control while the build process depends on the vendor-manifest.json file therein. However, the dist directory does not get regenerated on build for some reason. Perhaps the prepublish step node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod is not always executed, even though the main.js and main.js.map files are updated by build/debug?

The dist directory does get regenerated by running either webpack --config webpack.config.vendor.js or dotnet publish before debugging. I just copied the prepublish step as a new precompile step in project.json to prevent further head scratching:

{
  ...,
  "scripts": {
    "precompile": [
      "node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod"
    ],
    "prepublish": [
      "npm install",
      "node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod",
      "node node_modules/webpack/bin/webpack.js --env.prod"
    ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  },
  ...
}

Additionally, the project.json file is configured to output the node_modules directory by default. This is not required so you can just remove the "node_modules", line to prevent unnecessary copying of a large amount of files (unless, perhaps, if you refer to something in there that does not get bundled by webpack).

{
  ...,
  "publishOptions": {
    "include": [
      "appsettings.json",
      "node_modules",
      "Views",
      "web.config",
      "wwwroot"
    ],
    "exclude": [
      "wwwroot/dist/*.map"
    ]
  },
  ...
}

References: