在 AngularJS 和 Nodejs 之间共享代码
Posted
技术标签:
【中文标题】在 AngularJS 和 Nodejs 之间共享代码【英文标题】:Sharing code between AngularJS and Nodejs 【发布时间】:2014-09-24 00:57:51 【问题描述】:使用javascript
在前端和后端之间共享代码的最佳方式是什么,特别是在nodejs
和angularjs
之间?
问题是我们在后端和前端都使用了相同的enums
和constant 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 install
或 bower update
【讨论】:
感谢您分享您的经验,对我很有用:)以上是关于在 AngularJS 和 Nodejs 之间共享代码的主要内容,如果未能解决你的问题,请参考以下文章