在 Angularjs 中使用节点模块

Posted

技术标签:

【中文标题】在 Angularjs 中使用节点模块【英文标题】:Using node modules in Angularjs 【发布时间】:2018-04-01 10:10:42 【问题描述】:

我正在尝试使用第三方模块,该模块可用作我的 Angular 应用程序中的节点模块。我刚刚开始使用 Angular,我还没有完全理解模块化行为。 我正在通过脚本标签导入角度模块(路由器等)并将它们注入到我的主应用程序模块中,但我不知道如何注入节点模块。

Google 让我对 CommonJS、AMD 等词更加困惑,因为我刚刚开始学习模块化方法。 有人可以指导我如何在我的应用模块中注入节点模块吗?

我正在使用 AngularJS v1.6.4。我可以选择使用 browserify 和 webpack。两个我都有。

【问题讨论】:

您首先需要澄清您的问题,说明您使用的是 AngularJS (1.x) 还是 Angular(2.x 或更高版本),并告诉我们您如何构建您的应用程序。 @JB Nizet 我添加了那个细节 【参考方案1】:

使用 npm 安装模块后,您必须将其包含在 script 标签中。像这样

<script src="node_modules/angular-messages/angular-messages.min.js"></script>

(我以 angular-messages 为例)

这通常与所有其他脚本标记一起在 index.html 中完成。当然,路径必须是正确的。它将从服务器的角度来看,开发者工具会告诉您它是否找不到该文件。您必须检查模块文件夹和/或阅读模块的自述文件以查找要使用的文件。大多数模块所需的实际代码是单个 .js 文件。

您还可以缩短路径。如果你使用 express,它会像这样完成

app.use('/angular-messages', express.static(path.join(__dirname, 'node_modules/angular-messages')));

脚本标签会变成

<script src="angular-messages/angular-messages.min.js"></script>

因为 express 设置为将 angular-messages 路由到 node_modules/angular-messages

要让模块在 AngularJS 中工作,您必须将其作为依赖项添加到应用程序中。例如:

angular.module('myapp', ['ngRoute', 'ngMessages']).config(config).run(setupAuth)

模块的自述文件会告诉您模块的名称。在这种情况下,它被命名为ngMessages,因此它被添加为依赖项。这通常在您引导 AngularJS 应用程序(app.js 或类似文件)的文件中完成。您可以阅读有关模块功能如何工作的信息here。第二个参数通常是一个包含依赖名称的数组。

需要注意的是,只有 AngularJS 模块被添加到这个数组中。如果你有一个不是 AngularJS 模块的模块,例如 validator.js,你必须找到其他方法来使用它。当脚本包含在脚本标签中时

<script src="node_modules/validator/validator.min.js"></script>

它的代码将在全局 window 对象中可用。要在 AngularJS 中访问 window,您可以使用 $window 服务。例如:

let isItAlpha = $window.validator.isAlpha('test123'));

文件validator.min.js 允许访问一个名为validator 的对象,该对象包含一个名为isAlpha 的函数。我可以通过 $window 访问它,因为 window 对象包含从 validator.min.js 读取的代码。这可能不是使用非 AngularJS 模块的最纯粹的方式,但它确实有效。许多非 AngularJS 模块也将 AngularJS 包装器作为单独的模块。在尝试使用主版本之前,您可以尝试查找 AngularJS 版本。

在使用 browserify 和 webpack 之前,我会让它以这种方式工作。

【讨论】:

您的答案是否仅针对构建为 AngularJS 模块的 Node 模块,还是针对任何 Node 模块? @ThomasDavidKehoe,它不必是 AngularJS 特定的模块。例如,我在答案中使用的 validator.js 脚本看起来像 this(未缩小),并且不是 AngularJS 模块。特定于 Node 的代码通常不起作用,因为浏览器不支持某些语法(require 等)。 validator.js 库在这两个地方都可以使用,因为它是以通用方式编写的。 感谢您的解决方案。不是你说的最纯粹的方式。但在一些遗留项目上,它可以解决问题。 validator 正在工作,因为该库有一个带有纯 javascript 代码的 validator.js 文件,但如果该库完全基于 TypeScript 会怎样。在这种情况下,你将如何将它导入到 AngularJs 控制器中?

以上是关于在 Angularjs 中使用节点模块的主要内容,如果未能解决你的问题,请参考以下文章

前端小白之每天学习记录----angula2--

如何在您的 Ionic / AngularJs 应用程序中包含和使用节点模块?

AngularJS,Node.js,节点模块“幻影”... 注入错误,angularjs 试图加载我的指令 + 后缀

AngularJS的学习笔记

AngularJS的Hello World

初识AngularJS