nativeScript-nodeify-min
尽可能使大多数 npm 模块在 NativeScript 中 '正常工作'
npm i --save nativeScript-nodeify-min

NativeScript Nodeify

使大多数 npm 包与 NativeScript 兼容

问答

问. 什么鬼?

答. 好问题,很高兴你问了!你不能随意使用任何 npm 包与 NativeScript 一起,因为它们可能依赖于内置的 Node 模块(例如 fspathcrypto 等)。这些模块不是普通的 JavaScript 文件,所以它们不能在 {N} 运行时中执行。

问. 那这个插件是如何克服这个问题的呢?

答. 你可以像平常一样安装依赖项,包括这个插件,然后在构建时间,由这个插件安装的钩子将扫描并修改你的 npm 模块(在 平台文件夹中),使其适合 {N} 兼容。

问. 哈哈。修改我宝贵的模块!?

答. 是的。钩子会查看在 <app>/platforms/<ios|android>/.../tns_modules 中安装的包,并对每个依赖项执行一些操作

  • 在其 package.json 中寻找一个 browser 节点,并查找替换该包及其依赖项中的任何匹配的 require() 调用。
  • 如果 browser 节点中有 main 替换,它也会处理那个。
  • 如果任何依赖项(这可以非常深,记住 left-pad?)包含我们需要模拟的东西,我们将根据 这个列表 来处理。
  • 还有更多的技巧,可能还需要更多,所以这个列表目前正在演变。

问. 但浏览器ify / Webpack 不解决这个问题吗?

答. 在这种情况下不行,至少不是没有进一步的修改。想想那些在 package.json 中没有 browser 节点的模块,或者那些确实有但用需要真实浏览器的东西来模拟 node 依赖的模块。随时提交一个 PR 以获得更优雅的实现,但这是我想到的最好的方法。

问. 实际上还不错,但不会带来性能损失吗?

答. 谢谢。而且这是个好问题。最重要的是,在运行时这应该没有区别,因为你没有 'require' 更多你已经有的东西,只是不同的实现(希望它们真的能工作)。在构建时你会在你的构建中看到几秒钟的增加(但这不应该影响 livesync)。钩子跳过检查 tns-core-modules 和以 nativescript 开头的任何内容。

安装

从命令提示符进入你的应用程序的根文件夹并执行

tns plugin add nativescript-nodeify

用法

在需要使用有问题的 npm 模块的代码之前包含此内容。

require("nativescript-nodeify");

演示应用程序

演示 测试了几种流行的库,这些库依赖于 Node 内置模块,而这些模块在 NativeScript 运行时环境中通常无法正常工作。

从项目的根目录运行演示应用程序: npm run demo.iosnpm run demo.android

已知问题

此插件并非完美,但它试图解决数以千计的 npm 包中的问题。已知一些问题,如果你的问题不在这个列表中,请 创建一个问题

  • 像 Browserify 一样,我们使用模拟来填补 Node 和浏览器之间的差距,但与 Browserify 模拟不同,我们不运行在浏览器中,因此某些 API 可能不可用。例如,任何接触 DOM 的事情。
  • HTTP 模拟器并不完美(例如:使用 global.location.protocol.search),所以可能需要做类似于 RN 所做的那样,自己实现(如果有人需要的话)。

食谱

为了帮助你开始使用一些流行的 npm 模块,这里有一些食谱。请通过向这个仓库发送 PR 来分享你自己的食谱!

所有食谱都假设你已经完成了

$ tns create awssdk
$ cd awssdk
$ tns platform add ios
$ tns platform add android
$ tns plugin add nativescript-nodeify

node-uuid

$ npm install node-uuid --save

棒!完成了。

jsonwebtoken

$ npm install jsonwebtoken --save

棒!再次完成。

aws-sdkamazon-cognito-identity-js(它包含了 aws-sdk

这个需要一点设置,但并不太难

永远不要将你的 AWS 密钥提交到版本控制!机器人会扫描公共仓库并创建服务器实例,你将为此付费。

根据你的需求

$ npm install aws-sdk --save

或者

$ npm install amazon-cognito-identity-js --save

为了正确解析 AWS 返回的 XML(例如在列出 S3 存储桶内容时),我们需要修补一个额外的库,因为浏览器模拟器期望的是一个..嗯..浏览器。

所以打开你应用的 package.json 文件,并将这个 nodeify 节点添加到现有的 nativescript 节点

{
"nativescript": {
"nodeify": {
"package-dependencies": {
"aws-sdk": [
{
"xml/browser_parser": "xml/node_parser",
"lib/node_loader": "lib/browser_loader"
}
]
}
}
}
}

然后在你的 amazon-cognito-identity-js 代码中

// require this to fix an issue with xhr event states
require('nativescript-nodeify');

// register a user (here's a bit, but see the demo and https://github.com/aws/amazon-cognito-identity-js for details)
var AmazonCognitoIdentity = require('amazon-cognito-identity-js');
var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
var userPool = new CognitoUserPool({UserPoolId: 'foo', ClientId: 'bar'});

现在只需像往常一样使用 AWS 即可

// then require AWS and interact with s3, dynamo, whatnot
var AWS = require('aws');