Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(cli): exclude the crypto module #3819

Closed
wants to merge 4,785 commits into from
Closed

fix(cli): exclude the crypto module #3819

wants to merge 4,785 commits into from

Conversation

tc-imba
Copy link

@tc-imba tc-imba commented Jul 14, 2019

这个 PR 做了什么? (简要描述所做更改)

在微信小程序中开发涉及密码学对称/非对称加解密功能时,
我们使用了一些如 tweetnacl 的库,
在引入时遇到 require('crypto') 会报错,原因是crypto只在node端可用
( https://github.com/dchest/tweetnacl-js/blob/3e4e6ac4692a6a445d058bf4f2a60cbaa90d26a1/nacl-fast.js#L2366 )。

但此模块实际上遵循umd引入规则,不应有此错误。
同时,npm中的crypto模块也不能在浏览器使用,
所以taro编译时应该exclude crypto库来避免类似问题。

这个 PR 是什么类型? (至少选择一个)

  • 错误修复(Bugfix) issue id #
  • 新功能(Feature)
  • 代码重构(Refactor)
  • TypeScript 类型定义修改(Typings)
  • 文档修改(Docs)
  • 代码风格更新(Code style update)
  • 其他,请描述(Other, please describe):

这个 PR 满足以下需求:

  • 提交到 master 分支
  • Commit 信息遵循 Angular Style Commit Message Conventions
  • 所有测试用例已经通过
  • 代码遵循相关包中的 .eslintrc, .tslintrc, .stylelintrc 所规定的规范
  • 在本地测试可用,不会影响到其它功能

这个 PR 涉及以下平台:

  • 微信小程序
  • 支付宝小程序
  • 百度小程序
  • 头条小程序
  • QQ 轻应用
  • 快应用平台(QuickApp)
  • Web 平台(H5)
  • 移动端(React-Native)

其它需要 Reviewer 或社区知晓的内容:

taro-cli 中的jest存在bug,无法通过

yuche and others added 30 commits June 10, 2019 16:55
修复小程序端使用了 mobx 时不能用循环 ref 的问题。
* feat(taro-cli): 软件包更新列表新增 nervjs 和 nerv-devtools

* feat(taro-cli): taro update 更新 nervjs 依赖
@luckyadam
Copy link
Member

即使 taro 不做处理,crypto 这个模块应该也是不能在小程序里使用的,建议换个包吧

@tc-imba
Copy link
Author

tc-imba commented Jul 16, 2019

即使 taro 不做处理,crypto 这个模块应该也是不能在小程序里使用的,建议换个包吧

我们的小程序就是做密码学加密传输数据的功能,而这个bug和crypto模块无关,只是在库的加载判断时,taro无法判断crypto实际不会在浏览器中使用却仍然认为这是一个dependency导致的

tweet-nacl库的加载代码如下:

(function() {
  // Initialize PRNG if environment provides CSPRNG.
  // If not, methods calling randombytes will throw.
  var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;
  if (crypto && crypto.getRandomValues) {
    // Browsers.
    var QUOTA = 65536;
    nacl.setPRNG(function(x, n) {
      var i, v = new Uint8Array(n);
      for (i = 0; i < n; i += QUOTA) {
        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
      }
      for (i = 0; i < n; i++) x[i] = v[i];
      cleanup(v);
    });
  } else if (typeof require !== 'undefined') {
    // Node.js.
    crypto = require('crypto');
    if (crypto && crypto.randomBytes) {
      nacl.setPRNG(function(x, n) {
        var i, v = crypto.randomBytes(n);
        for (i = 0; i < n; i++) x[i] = v[i];
        cleanup(v);
      });
    }
  }
})();

@nyrf
Copy link

nyrf commented Aug 7, 2019

试试这个?crypto-js, 我用这个没问题

@Littly
Copy link
Contributor

Littly commented Aug 12, 2019

image

用静态的办法去判断Node环境吧,可以用env常量。这种判断require函数存在与否的方法,在编译时是无法处理的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.