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