uni-app 微信小程序导入JSEncrypt报错eval is not function | crypto of undefined

uni-app导入加密库JSEncrypt,在浏览器端一般没问题,而在小程序端会有类似报错:

eval is not function ...

crypto of undefined ...

不难看出这是小程序环境问题,官方为了安全直接把eval函数禁用了,crypto则是在JSEncrypt中挂载window对象下,而小程序环境没有浏览器那样的window对象。

1. 解决eval问题

选用压缩版,如果用npm/yarn方式安装的依赖库,目录中自带有压缩版jsencrypt.min.js

import JSEncrypt from 'jsencrypt/bin/jsencrypt.min.js';

2. 解决无window/navigator的问题

先替换全局变量,避免污染主环境的变量:

navigator全部替换为 customNavigator
window全部替换为 customWindow

然后,自定义新的全局变量,在压缩版文件头部添加如下参考代码:

   var customNavigator = {
    appName: 'Netscape',
    userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 	(KHTML, like  	 Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
  };
   var customWindow = {
    ASN1: null,
    Base64: null,
    Hex: null,
    crypto: null,
    href: null
  };

重新编译项目即可。

参考资料:https://blog.csdn.net/qq_38318589/article/details/115371454