在角度通用应用程序(nodejs)上集成newrelic

Uba*_*zad 6 node.js newrelic webpack angular-universal angular

我在nodejs app上集成了newrelic,用angular universal制作.我正在使用webpack进行捆绑

main.server.aot.ts中的第一行

const newrelic = require('newrelic');
Run Code Online (Sandbox Code Playgroud)

并在根目录中添加了newrelic.js.

正在运行的构建弹出以下错误: -

ERROR in ./node_modules/@newrelic/native-metrics/lib/pre-build.js
Module not found: Error: Can't resolve '../package' in 'D:\repos\ib-mobile\node_modules\@newrelic\native-metrics\lib'
 @ ./node_modules/@newrelic/native-metrics/lib/pre-build.js 40:12-33
 @ ./node_modules/@newrelic/native-metrics/index.js
 @ ./node_modules/newrelic/lib/sampler.js
 @ ./node_modules/newrelic/lib/agent.js
 @ ./node_modules/newrelic/index.js
 @ ./src/main.server.aot.ts

ERROR in ./node_modules/node-gyp/lib/node-gyp.js
Module not found: Error: Can't resolve '../package' in 'D:\repos\ib-mobile\node_modules\node-gyp\lib'
 @ ./node_modules/node-gyp/lib/node-gyp.js 67:16-37
 @ ./node_modules/@newrelic/native-metrics/lib/pre-build.js
 @ ./node_modules/@newrelic/native-metrics/index.js
 @ ./node_modules/newrelic/lib/sampler.js
 @ ./node_modules/newrelic/lib/agent.js
 @ ./node_modules/newrelic/index.js
 @ ./src/main.server.aot.ts

ERROR in ./node_modules/newrelic/index.js
Module not found: Error: Can't resolve './package' in 'D:\repos\ib-mobile\node_modules\newrelic'
 @ ./node_modules/newrelic/index.js 13:19-39
 @ ./src/main.server.aot.ts
Run Code Online (Sandbox Code Playgroud)

如果我在webpack配置中添加newrelic作为外部

module.exports = {
  entry: root('./src/main.server.aot.ts'),
  output: {
    path: root('dist_server'),
    filename: 'server.js'
  },
  target: 'node',
  externals: {
    newrelic: true
  }
};
Run Code Online (Sandbox Code Playgroud)

然后我得到另一个错误

/home/ubuntu/ib-mobile/dist_server/server.js:79752

module.exports = newrelic;
                 ^

ReferenceError: newrelic is not defined
    at Object.<anonymous> (/home/ubuntu/ib-mobile/dist_server/server.js:79752:18)
    at __webpack_require__ (/home/ubuntu/ib-mobile/dist_server/server.js:26:30)
    at Object.module.exports (/home/ubuntu/ib-mobile/dist_server/server.js:79667:16)
    at __webpack_require__ (/home/ubuntu/ib-mobile/dist_server/server.js:26:30)
    at /home/ubuntu/ib-mobile/dist_server/server.js:91:18
    at Object.<anonymous> (/home/ubuntu/ib-mobile/dist_server/server.js:94:10)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
Run Code Online (Sandbox Code Playgroud)

角度版本 (ng -v)

Angular CLI: 1.6.3
Node: 6.11.0
OS: win32 x64
Angular: 4.4.6
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, platform-server, router
... tsc-wrapped

@angular/cli: 1.6.3
@angular-devkit/build-optimizer: 0.0.36
@angular-devkit/core: 0.0.22
@angular-devkit/schematics: 0.0.42
@ngtools/json-schema: 1.1.0
@ngtools/webpack: 1.9.3
@schematics/angular: 0.1.11
@schematics/schematics: 0.0.11
typescript: 2.3.4
webpack: 3.10.0
Run Code Online (Sandbox Code Playgroud)

san*_*guy 1

找到了解决这个问题的巧妙方法!

总长DR

本质上,这一切所做的就是配置 webpack 在 server.js 文件顶部添加导入,然后 BAM 就可以工作了。

问题

因此,您所做的一切都是正确的,但是通过告诉 webpack 您希望 newrelic 模块位于外部,您就告诉它在运行应用程序时 newrelic 实例将在内存中可用。显然我们还没有这样做,这就是为什么我们收到您上面提到的错误。我认为此功能的用例是针对浏览器的,您在其中包含带有 的脚本,<script src="{http://example.com/script.js}" />因此您不希望 webpack 关心尝试解决来自 node_modules 的依赖关系。

解决方案

我们不使用“externals”属性,而是简单地将标准 Nodejs 导入添加var newrelic = require('newrelic');到运行expressjs 节点应用程序的文件中(与人们期待的新遗迹完全一样)。

为了做到这一点,我们需要以下内容:

  • BannerWebpack插件
  • 了解我们的 Nodejs Express 应用程序正在运行哪个输出块/文件。

要安装BannerWebpackPlugin,只需执行以下操作:npm install --save-dev banner-webpack-plugin

至于块/文件,您可以查看错误日志(您可以从这个错误片段中看到它是 server.js 块/文件):

ReferenceError: newrelic is not defined at Object.<anonymous> (/home/ubuntu/ib-mobile/dist_server/server.js:79752:18)

或者你可以查看 webpack 文件的“entry”属性并找到由 webpack 生成的块(在我的例子中,这也是一个输出到 server.js 的“服务器”。

现在我们有了这些信息,我们只需通过 webpack 配置插件部分将横幅配置添加到我们的块中即可。

这就是我的样子:

plugins: [
...,
    new BannerPlugin({
        chunks: {
            server:{
                beforeContent: 'var newrelic = require("newrelic");'
            }
       }
    }),
...]
Run Code Online (Sandbox Code Playgroud)

此时,您应该能够运行您的 webpack 构建并让您的新遗物工作!

如果您之前在应用程序代码中包含了 require,那么您现在可以将其删除,并且 webpack 导入应该足以让 newrelic 代理运行。