nativescript-nodeify
尝试让大多数 npm 模块在 NativeScript 中“直接使用”
npm i --save nativescript-nodeify

NativeScript Nodeify

使大多数 npm 包与 NativeScript 兼容

问答

问:WTF?

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

问:那么这个插件是如何克服这种情况的?

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

问:Lol。Wut?修改我宝贵的模块!?

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

  • 在它们的 package.json 中查找 browser 节点,并在该包及其依赖项中查找并替换任何匹配的 require() 调用。
  • 如果 browser 节点中有 main 替换,它也会处理那个。
  • 如果任何依赖项(这可能非常深——记住 left-pad?)包含我们需要模拟的内容,我们将根据 此列表 进行操作。
  • 还有更多技巧,可能还需要更多,因此这个列表目前正在不断发展。

问:但是 browserify / 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一样,我们使用shims来填补Node和浏览器之间的差距,但与Browserify的shims不同,我们不在浏览器中运行,因此一些API可能不可用。例如,任何接触DOM的东西。
  • http shim并不完美(例如使用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存储桶内容时),我们需要修复一个额外的库,因为浏览器shim期望一个……嗯……浏览器。

所以打开您应用的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');