- 版本:0.8.0
- GitHub:
- NPM: https://npmjs.net.cn/package/nativescript-nodeify
- 下载
- 昨天: 0
- 上周: 0
- 上个月: 0
NativeScript Nodeify
使大多数 npm 包与 NativeScript 兼容
问答
问:WTF?
答:好问题,很高兴你问了!你不能直接使用任何 npm 包与 NativeScript 一起使用,因为它们可能依赖于内置的 Node 模块(例如 fs
、path
、crypto
等)。这些模块不是普通的 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.ios
或 npm 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-sdk
或amazon-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');