在 AngularJS 和 Nodejs 之间共享代码

Posted

技术标签:

【中文标题】在 AngularJS 和 Nodejs 之间共享代码【英文标题】:Sharing code between AngularJS and Nodejs 【发布时间】:2014-09-24 00:57:51 【问题描述】:

使用javascript在前端和后端之间共享代码的最佳方式是什么,特别是在nodejsangularjs之间?

问题是我们在后端和前端都使用了相同的enumsconstant values,例如error codes。现在我们只是将每个更改复制并粘贴到两个平台,这不是一个好的解决方案。还有一些服务可以共享。

我见过browserify之类的库;但这不正是我要找的。我正在寻找类似于java 中的maven dependency 的解决方案。在java 中,可以使用maven 轻松共享库,而我在javascript 中找不到类似的方法。 有没有办法隔离这些服务,并使用npm 独立地将它们作为对nodejs 的依赖,以及使用bower 独立使用angularjs 的依赖关系?或者前后端共享相同代码的方式有哪些?

【问题讨论】:

browserify 允许您在客户端使用常用的 js 模块。这与复制和粘贴完全不同。 如果你想要比 browserify 更简单的东西,我觉得这可以用 RequireJS 解决。我同意@tkone,browserify 不是复制/粘贴。当然,它是将您的公共库复制到另一个文件中,但这相当于说编译代码是将源代码复制/粘贴到二进制文件中。 @tony 甚至没有复制。就是那个 ACTUAL 文件。 require 填充到浏览器中,允许使用相同的确切代码。它甚至可以执行熟悉的function(__dirname,... 包装该节点的操作(因为它让节点为您执行此操作!)。 【参考方案1】:

有几种方法可以做到这一点。第一个是您可以通过 bower 为前端代码创建一个新包,并通过 npm 为后端代码创建一个新包。我有几个包发布到这两个系统。

Install with Bower -- 有关如何安装不在注册表中的模块的信息

NPM Install docs -- 使用 npm 安装的所有方式(带有 auth 的私有 github:git+ssh://git@github.com/[org]/[repo]

只需使用您的共享数据创建一个新模块,然后使用两个包管理器安装它。它们都允许您安装未发布的模块,因此如果它是私有数据,您可以保留它。

如果您的前端需要require.js,您可以使用amdefine 之类的东西将其提供给您的节点后端,或者如果您只是使用旧版窗口代码,您可以执行以下操作:

var mydata = ;

if(typeof window !== 'undefined')
    window.mydata = mydata;
 else 
     module.exports = mydata;

如果您要共享大量数据,我强烈建议您研究 browserify 以在 commonjs 中编写您的整个代码库并使用 browserify 生成您的客户端包。有一个关于使用 browserify 的 laundry list of resources,包括如何使用 use browserify and angular together

【讨论】:

【参考方案2】:

免责声明 - 我仍在开发这种方法,它是一个小手册。 我使用 npm、一个名为 pac 的 npm cli 和 bower 来做到这一点。 Pac 让我避免在生产中使用npm install,方法是将模块保存为 .tgz 文件(提交到源代码控制中的项目)。使用 pac,当有人签出节点项目时,他们运行 pac install 然后 npm rebuild 而不是 npm install

我的共享代码保存在一个目录(我的模块)中。它既有 package.json 又有 bower.json。

我的消费节点应用程序有一个 package.json 依赖项: “我的模块”:“x.y.z”

我的消费客户端有一个 bower.json 依赖项: “我的模块”:“../relative/path/to/my-module”

当我对我的模块进行更新时,我会通过以下方式更新我的节点应用程序:

    制作 my-module 内容的 tar.gz: tar -czvf my-module.tar.gz -C my-module 从节点应用的 node_modules 中删除旧版本 重新运行npm install path/to/my-module-tar.gz 重新运行 pac(这会生成 node_modules/my-module 的 .tgz) 提交更新的 pac .modules/my-module.tgz

我通过以下方式更新我的客户:

    删除旧客户端/bower_components/my-module 重新运行 bower installbower update

【讨论】:

感谢您分享您的经验,对我很有用:)

以上是关于在 AngularJS 和 Nodejs 之间共享代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AngularJS 中的两个模块之间共享数据?

在 Angularjs 组件之间共享数据

在 AngularJS 控制器之间共享数据

AngularJS:为啥人们更喜欢工厂在控制器之间共享数据[重复]

在 AngularJS 中的两个指令之间共享数据

在 AngularJS 控制器之间共享数据? [复制]