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



我正在nodejs应用程序上集成newrelic,由角度通用制成。我正在使用网络包进行捆绑

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

const newrelic = require('newrelic');

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

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

ERROR in ./node_modules/@newrelic/native-metrics/lib/pre-build.js
Module not found: Error: Can't resolve '../package' in 'D:reposib-mobilenode_modules@newrelicnative-metricslib'
@ ./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:reposib-mobilenode_modulesnode-gyplib'
@ ./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:reposib-mobilenode_modulesnewrelic'
@ ./node_modules/newrelic/index.js 13:19-39
@ ./src/main.server.aot.ts

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

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

然后我得到另一个错误,因为

/

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)

角度版本(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

对于所描述的问题,有更优雅的解决方案。您可以设置 webpack 外部字段,例如函数:

(context, request, callback) => {
var regex = new RegExp(`^newrelic$`);
if (regex.test(request)) {
return callback(null, `commonjs ${request}`);
}
callback();
}

这将告诉 webpack 保持const newrelic = require('newrelic');在捆绑文件中的状态。您所需要的只是将带有newrelic的node_modules放置在正在运行的服务器附近。 第二种解决方案是将output的 libraryType 属性设置为commonjs然后以下externals语法将起作用:

externals : {
newrelic : {
commonjs: 'newrelic'
}
}

找到了一个破解方法来解决这个问题!

TLDR

本质上,所有这些所做的只是配置 webpack 以在服务器.js文件的顶部添加导入,并且 BAM 它可以工作。

问题

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

溶液

我们将不使用"externals"属性,而是简单地将标准nodejs导入var newrelic = require('newrelic');添加到运行expressjs node应用程序的文件中(就像人们所期望的新遗物一样)。

为此,我们需要以下内容:

  • 横幅网络包插件
  • 了解我们的 nodejs Express 应用程序正在运行哪个输出块/文件。

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

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

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

或者你可以查看 webpack 文件的"entry"属性并找到 webpack 生成的块(在我的情况下,这也是输出到服务器的"服务器".js。

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

这是我的样子:

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

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

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

最新更新