在 angular 通用应用程序 (nodejs) 上集成 newrelic
Integrating newrelic on angular universal application (nodejs)
我正在用 angular 通用的 nodejs 应用程序集成 newrelic。我正在使用 webpack 进行捆绑
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:\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
如果我在 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)
Angular 版本 (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
找到了解决此问题的 hacky 方法!
TLDR
基本上所有这些所做的就是配置 webpack 以在 server.js 文件的顶部添加导入,并且 BAM 它可以工作。
问题
所以你所做的一切都是正确的,但是通过告诉 webpack 你希望 newrelic 模块是外部的,你告诉它当 运行 应用程序时,newrelic 实例将在内存中可用。
我们显然没有这样做,这就是我们收到您上面提到的错误的原因。
我认为此功能的用例是针对浏览器的,您在浏览器中包含带有 <script src="{http://example.com/script.js}" />
的脚本,因此您不希望 webpack 自己尝试解决来自 node_modules.[=15 的依赖关系=]
解决方案
而不是使用 "externals" 属性,我们将简单地将我们的标准 nodejs 导入 var newrelic = require('newrelic');
添加到 运行 expressjs 节点应用程序的文件中(与人们期待的新遗物一模一样。
为此,我们需要以下内容:
- BannerWebpackPlugin
- 知道chunk/file 我们的 nodejs express 应用程序是 运行ning。
为了安装 BannerWebpackPlugin 只需执行以下操作:npm install --save-dev banner-webpack-plugin
至于 chunk/file 你可以看看错误日志(你可以从这个错误片段中看到它是 server.js chunk/file):
ReferenceError: newrelic is not defined
at Object.<anonymous> (/home/ubuntu/ib-mobile/dist_server/server.js:79752:18)
或者您可以查看 webpack 文件 "entry" 属性 并找到 webpack 生成的块(在我的例子中,这也是一个 "sever"输出到 server.js.)
现在我们有了这些信息,我们只需要通过 webpack 配置插件部分向我们的块添加一个横幅配置。
这是我的样子:
plugins: [
...,
new BannerPlugin({
chunks: {
server:{
beforeContent: 'var newrelic = require("newrelic");'
}
}
}),
...]
此时你应该能够运行你的 webpack 构建并让你的新遗物工作!
如果您以前在应用程序代码中包含一个 require,您现在可以将其删除,并且 webpack 导入应该足以获取 newrelic 代理 运行ning。
描述的问题有更优雅的解决方案。您可以设置 webpack 外部字段,如函数:
(context, request, callback) => {
var regex = new RegExp(`^newrelic$`);
if (regex.test(request)) {
return callback(null, `commonjs ${request}`);
}
callback();
}
这将告诉 webpack 将 const newrelic = require('newrelic');
保留在捆绑文件中。您只需将 node_modules 和 newrelic 放置在您的 运行 服务器附近。
第二种解决方案是将 output
的 libraryType 属性 设置为 commonjs
然后以下 externals
语法将起作用:
externals : {
newrelic : {
commonjs: 'newrelic'
}
}
我正在用 angular 通用的 nodejs 应用程序集成 newrelic。我正在使用 webpack 进行捆绑
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:\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
如果我在 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)
Angular 版本 (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
找到了解决此问题的 hacky 方法!
TLDR
基本上所有这些所做的就是配置 webpack 以在 server.js 文件的顶部添加导入,并且 BAM 它可以工作。
问题
所以你所做的一切都是正确的,但是通过告诉 webpack 你希望 newrelic 模块是外部的,你告诉它当 运行 应用程序时,newrelic 实例将在内存中可用。
我们显然没有这样做,这就是我们收到您上面提到的错误的原因。
我认为此功能的用例是针对浏览器的,您在浏览器中包含带有 <script src="{http://example.com/script.js}" />
的脚本,因此您不希望 webpack 自己尝试解决来自 node_modules.[=15 的依赖关系=]
解决方案
而不是使用 "externals" 属性,我们将简单地将我们的标准 nodejs 导入 var newrelic = require('newrelic');
添加到 运行 expressjs 节点应用程序的文件中(与人们期待的新遗物一模一样。
为此,我们需要以下内容:
- BannerWebpackPlugin
- 知道chunk/file 我们的 nodejs express 应用程序是 运行ning。
为了安装 BannerWebpackPlugin 只需执行以下操作:npm install --save-dev banner-webpack-plugin
至于 chunk/file 你可以看看错误日志(你可以从这个错误片段中看到它是 server.js chunk/file):
ReferenceError: newrelic is not defined
at Object.<anonymous> (/home/ubuntu/ib-mobile/dist_server/server.js:79752:18)
或者您可以查看 webpack 文件 "entry" 属性 并找到 webpack 生成的块(在我的例子中,这也是一个 "sever"输出到 server.js.)
现在我们有了这些信息,我们只需要通过 webpack 配置插件部分向我们的块添加一个横幅配置。
这是我的样子:
plugins: [
...,
new BannerPlugin({
chunks: {
server:{
beforeContent: 'var newrelic = require("newrelic");'
}
}
}),
...]
此时你应该能够运行你的 webpack 构建并让你的新遗物工作!
如果您以前在应用程序代码中包含一个 require,您现在可以将其删除,并且 webpack 导入应该足以获取 newrelic 代理 运行ning。
描述的问题有更优雅的解决方案。您可以设置 webpack 外部字段,如函数:
(context, request, callback) => {
var regex = new RegExp(`^newrelic$`);
if (regex.test(request)) {
return callback(null, `commonjs ${request}`);
}
callback();
}
这将告诉 webpack 将 const newrelic = require('newrelic');
保留在捆绑文件中。您只需将 node_modules 和 newrelic 放置在您的 运行 服务器附近。
第二种解决方案是将 output
的 libraryType 属性 设置为 commonjs
然后以下 externals
语法将起作用:
externals : {
newrelic : {
commonjs: 'newrelic'
}
}