Nrwl / Nx - 如何构建浏览器可使用的单个 js 文件并捆绑依赖项

Nrwl / Nx - how to build single js file consumable by browser with dependencies bundled

我需要构建一个 js 可以用作 Service Worker

我有一个包含两个 @nrwl/web:lib 包的 nrwl 工作区,一个是 common,另一个是 workerworker 包使用 commonimport { stuff } from @my/common.

使用 library 项目类型 rollup,但是,worker.umd.js 不包含 common 依赖项,所以我需要两个 common.umd.jsworker.umd.js 并且必须在用作 Service Worker 之前手动连接它们。

With application 项目类型 webpack 被使用,它也捆绑了 common 依赖,但也会生成其他 js 文件,例如 vendor.js, polyfills.js 等。为此,我使用了 @nrwl/angular 因为 @nrwl/web:application 无法发布。

有没有更好的方法?我应该为此使用其他一些 nrwl 插件吗?如果可能,我想避免 angularreact,但如果需要我会使用它。或者我应该以某种方式自定义 rollupwebpack 配置?或者创建我自己的插件?

好的,所以我终于想出了这个解决方案。

我使用了一个 @nrwl/web:application 插件来构建 webpack。

为了摆脱多个js文件,我自定义了这样的配置:

workspace.json中(“worker”是我的项目):

  • 添加了 "vendorChunk": false 以摆脱供应商块,
  • 删除了 "polyfills": ... 以删除 polyfills 块,
  • 删除了 "styles" 因为我不需要那些,
  • 添加了 "webpackConfig": ... 以提供自定义 webpack 配置。

这是workspace.json的相关部分。

"worker": {
    "root": "packages/worker",
    "sourceRoot": "packages/worker/src",
    "projectType": "application",
    "architect": {
    "build": {
        "builder": "@nrwl/web:build",
        "outputs": ["{options.outputPath}"],
        "options": {
            "vendorChunk": false,
            "outputPath": "dist/packages/worker",
            "index": "packages/worker/src/index.html",
            "main": "packages/worker/src/main.ts",
            "tsConfig": "packages/worker/tsconfig.app.json",
            "webpackConfig": "packages/worker/webpack.config.js",
            "scripts": []
        },
...

将自定义 webpack.config.js 添加到 worker 项目根目录:

module.exports = function (baseConfig) {
    baseConfig.optimization.runtimeChunk = false;
    return baseConfig;
};

这是为了删除运行时块。我不得不这样做,因为 @nrwl/web 插件没有 runtimeChunk 选项。

移除块中的所有代码都将包含在主块中。

就是这样,现在所有内容都编译为单个 main.js 文件,我可以将其作为 Service Worker 加载。

还没有尝试修复发布,但我可能只是手动添加一个 package.json 并将其放入 workspace.json 中的 "assets"