Angular 似乎将开发依赖项构建到通用包中?

Angular seems to build dev dependencies into universal bundle?

我正在使用 typegoose 来统一我的界面 + 数据库模式在 ~6 个应用程序之间共享。它帮助我保持数据结构的一致性。

现在这意味着我 Angular 应用程序中的大部分 types/interfaces 来自 external project.

因此我有:

    "typegoose": "^5.9.0",
    "@types/mongoose": "^5.5.17",
    "mongoose": "^5.6.12",
    "@tlabs/models": "^1.7.13",

添加为开发依赖项。一切正常,我什至可以构建,但是当我尝试使用通用构建时,我可以看到此警告:

WARNING in ./node_modules/mongoose/lib/index.js 11:28-64
Critical dependency: the request of a dependency is an expression

x5 倍大约 mongodb/mongoose

当我检查我的 lambda 函数日志时,我可以看到:

2019-09-17T14:56:59.691Z undefined ERROR (node:8) DeprecationWarning: This Package got moved, please use `@hasezoey/typegoose` | github:hasezoey/typegoose

来自 typegoose,这让我很困惑。

我 100% 只使用 as 类型,如果我尝试通过使用其中一种类型实例化 class 对象来使用它,整个应用程序将根本无法运行。

关于这里的 webpack 配置,我是否遗漏了什么?

我在处理 angular 通用数据库和其他 SQL 数据库时也遇到了类似的错误。但是,有一个解决方案至少对我有用。

那就是 webpack-node-externals 包。这只会让 webpack 忽略你的 node_modules 文件夹。

Link 到 NPM 页面 >> https://www.npmjs.com/package/webpack-node-externals

假设您 webpack.server.config.js 中的所有其他内容应该可以解决这些错误并使您的包大小小得多。 (请记住,在部署到其他环境时,您需要包含 node_modules 文件夹)

简要教程

  1. npm i webpack-node-externals
  2. 在文本编辑器中打开 webpack.server.config.js
  3. 将该文件格式化为如下所示:
module.exports = env => {
  return {
    mode: "production",
    entry: {
      // This is our Express server for Dynamic universal
      server: "./server.ts"
    },
    externals: {
      "./dist/server/main": 'require("./server/main")'
    },
    target: "node",
    node: {
      __dirname: false,
      __filename: false
    },
    externals: [nodeExternals()], // <======LOOK HERE======|
    resolve: { extensions: [".ts", ".js"] },
    optimization: {
      minimize: false
    },
    output: {
      // Puts the output at the root of the dist folder
      path: path.join(__dirname, "dist"),
      filename: "[name].js"
    },
    module: {
      noParse: /polyfills-.*\.js/,
      rules: [
        { test: /\.ts$/, loader: "ts-loader" },
        {
          // Mark files inside `@angular/core` as using SystemJS style dynamic imports.
          // Removing this will cause deprecation warnings to appear.
          test: /(\|\/)@angular(\|\/)core(\|\/).+\.js$/,
          parser: { system: true }
        }
      ]
    },
    plugins: [
      new webpack.ContextReplacementPlugin(
        // fixes WARNING Critical dependency: the request of a dependency is an expression
        /(.+)?angular(\|\/)core(.+)?/,
        path.join(__dirname, "src"), // location of your src
        {} // a map of your routes
      ),
      new webpack.ContextReplacementPlugin(
        // fixes WARNING Critical dependency: the request of a dependency is an expression
        /(.+)?express(\|\/)(.+)?/,
        path.join(__dirname, "src"),
        {}
      ),
    ]
  };
};