dcloudio / uni-app

A cross-platform framework using Vue.js
https://uniapp.dcloud.io
Apache License 2.0
40.1k stars 3.63k forks source link

uuid 库的使用 #3025

Closed sufuwang closed 2 years ago

sufuwang commented 2 years ago

遇到一个 bug ,引入 uuid 库导致打包报错,报错如下

TypeError: index.requireNativePlugin is not a function
   at Object.getRandomValues (vendor.js? [sm]:5091)
   at rng (vendor.js? [sm]:5105)
   at Object.v4 (vendor.js? [sm]:5125)
   at app.js? [sm]:18
   at p (VM109 WAService.js:2)
   at <anonymous>:3:9
   at doWhenAllScriptLoaded (<anonymous>:1133:21)
   at Object.scriptLoaded (<anonymous>:1161:5)
   at Object.<anonymous> (<anonymous>:1186:22)(env: macOS,mp,1.05.2110290; lib: 2.21.0)

测试工程:https://github.com/sufuWang/uniapp_vite

fxy060608:requireNativePlugin的问题会修复,但uuid这个库是不支持小程序的,即使我们处理了这个报错,你也没法直接用uuid这个库

大佬,具体情况是这样的,原先使用 webpack 打包 vue2 项目,使用 uuid 库是不报错的,现在迁移到 vite 打包,报这个错误

fxy060608 commented 2 years ago

我测试vue2的项目,运行到小程序,一样报错:crypto.getRandomValues() not supported.

sufuwang commented 2 years ago

package.json 如下,这个项目现在就可以运行

{
  "dependencies": {
    "@dcloudio/uni-app-plus": "^2.0.0-26920200424005",
    "@dcloudio/uni-cli-i18n": "^2.0.0-32920210927001",
    "@dcloudio/uni-h5": "^2.0.0-26920200424005",
    "@dcloudio/uni-helper-json": "*",
    "@dcloudio/uni-i18n": "^2.0.0-32920210927001",
    "@dcloudio/uni-mp-alipay": "^2.0.0-26920200424005",
    "@dcloudio/uni-mp-baidu": "^2.0.0-26920200424005",
    "@dcloudio/uni-mp-qq": "^2.0.0-26920200424005",
    "@dcloudio/uni-mp-toutiao": "^2.0.0-26920200424005",
    "@dcloudio/uni-mp-weixin": "^2.0.0-31920210709003",
    "@dcloudio/uni-quickapp-light": "^2.0.0-26920200424005",
    "@dcloudio/uni-quickapp-vue": "^2.0.0-26920200424005",
    "@dcloudio/uni-stat": "^2.0.0-26920200424005",
    "@dcloudio/uni-ui": "1.3.7",
    "@vue/composition-api": "1.0.5",
    "core-js": "^2.6.5",
    "cos-wx-sdk-v5": "^1.0.11",
    "es6-promisify": "^6.1.1",
    "flyio": "^0.6.2",
    "js-cookie": "^2.2.1",
    "md5": "^2.2.1",
    "minapp-api-promise": "^1.0.2",
    "mockjs": "^1.1.0",
    "node-sass": "^4.14.1",
    "promisify": "0.0.3",
    "regenerator-runtime": "^0.12.1",
    "uni-composition-api": "^0.5.9",
    "uni-ui": "1.0.0",
    "vue": "^2.6.10",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@dcloudio/uni-cli-i18n": "^2.0.0-32920210927001",
    "@dcloudio/uni-cli-shared": "^2.0.0-26920200424005",
    "@dcloudio/uni-migration": "^2.0.0-26920200424005",
    "@dcloudio/uni-template-compiler": "^2.0.0-26920200424005",
    "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0-26920200424005",
    "@dcloudio/vue-cli-plugin-uni": "^2.0.0-26920200424005",
    "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0-26920200424005",
    "@dcloudio/webpack-uni-mp-loader": "^2.0.0-26920200424005",
    "@dcloudio/webpack-uni-pages-loader": "^2.0.0-26920200424005",
    "@types/html5plus": "*",
    "@types/uni-app": "*",
    "@typescript-eslint/eslint-plugin": "^4.29.0",
    "@typescript-eslint/parser": "^4.28.5",
    "@vue/cli-plugin-babel": "^3.7.0",
    "@vue/cli-plugin-eslint": "^4.5.15",
    "@vue/cli-plugin-typescript": "^4.5.13",
    "@vue/cli-plugin-unit-jest": "^4.5.13",
    "@vue/cli-service": "^3.12.1",
    "babel-plugin-import": "^1.11.0",
    "cross-env": "^7.0.2",
    "dayjs": "^1.8.35",
    "eslint": "^7.28.0",
    "eslint-plugin-prettier": "^3.4.0",
    "eslint-plugin-vue": "^7.1.0",
    "husky": "^4.3.8",
    "less-loader": "^6.0.0",
    "lint-staged": "^10.5.4",
    "lodash": "^4.17.21",
    "mini-types": "*",
    "miniprogram-api-typings": "^2.8.0-2",
    "postcss-comment": "^2.0.0",
    "prettier": "^2.3.2",
    "sass": "^1.36.0",
    "sass-loader": "^8.0.2",
    "typescript": "^4.3.4",
    "uglifyjs-webpack-plugin": "^2.2.0",
    "uuid": "^3.2.1",
    "vue-eslint-parser": "^7.10.0",
    "vue-template-compiler": "^2.6.10"
  },
  "browserslist": [
    "Android >= 4",
    "ios >= 8"
  ],
  "uni-app": {
    "scripts": {}
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged && npm run pre-push"
    }
  },
  "lint-staged": {
    "src/**/*.{js,ts,vue}": [
      "npm run lint"
    ]
  }
}
fxy060608 commented 2 years ago

那你需要锁定下uuid的版本为:"^3.2.1" 我测试的高版本不行

fxy060608 commented 2 years ago

https://github.com/dcloudio/uni-app/commit/1ccfd468ef46157ee2c2525021587ab1dd4bb384

sufuwang commented 2 years ago

那你需要锁定下uuid的版本为:"^3.2.1" 我测试的高版本不行

vite 打包中,即使锁定版本号,也无法打包成功,测试工程 :https://github.com/sufuWang/uniapp_vite 如果这一问题在 vite 项目中,无法解决,请问推荐使用什么 npm 包来代替 uuid ?

fxy060608 commented 2 years ago

那你需要锁定下uuid的版本为:"^3.2.1" 我测试的高版本不行

vite 打包中,即使锁定版本号,也无法打包成功,测试工程 :https://github.com/sufuWang/uniapp_vite 如果这一问题在 vite 项目中,无法解决,请问推荐使用什么 npm 包来代替 uuid ?

  1. 报requireNativePlugin的bug会修复
  2. uuid 3.2.1 版本不支持es module,需要配置commonjs的转换
  3. 建议更换其他支持小程序的uuid库,可以自行搜索小程序 生成uuid
sufuwang commented 2 years ago

好的

sufuwang commented 2 years ago

那你需要锁定下uuid的版本为:"^3.2.1" 我测试的高版本不行

vite 打包中,即使锁定版本号,也无法打包成功,测试工程 :https://github.com/sufuWang/uniapp_vite 如果这一问题在 vite 项目中,无法解决,请问推荐使用什么 npm 包来代替 uuid ?

  1. 报requireNativePlugin的bug会修复
  2. uuid 3.2.1 版本不支持es module,需要配置commonjs的转换
  3. 建议更换其他支持小程序的uuid库,可以自行搜索小程序 生成uuid

大佬,还是有一些疑问,uuid 最新版本支持 es module 和 commonjs ,即使不支持,这个也不应该成为打包失败的主要原因,因为使用插件转换模块应该是打包工具的基础能力,想问一下小程序不支持 uuid 库的主要原因是什么呀

fxy060608 commented 2 years ago

那你需要锁定下uuid的版本为:"^3.2.1" 我测试的高版本不行

vite 打包中,即使锁定版本号,也无法打包成功,测试工程 :https://github.com/sufuWang/uniapp_vite 如果这一问题在 vite 项目中,无法解决,请问推荐使用什么 npm 包来代替 uuid ?

  1. 报requireNativePlugin的bug会修复
  2. uuid 3.2.1 版本不支持es module,需要配置commonjs的转换
  3. 建议更换其他支持小程序的uuid库,可以自行搜索小程序 生成uuid

大佬,还是有一些疑问,uuid 最新版本支持 es module 和 commonjs ,即使不支持,这个也不应该成为打包失败的主要原因,因为使用插件转换模块应该是打包工具的基础能力,想问一下小程序不支持 uuid 库的主要原因是什么呀

uuid使用了crypto的getRandomValues,小程序不支持,只有微信提供了wx.getRandomValues,而且还是异步方法

sufuwang commented 2 years ago

uuid@3.2.0 中使用 crypto.randomBytes 方法 uuid@8.3.2 中使用 crypto.randomFillSync 方法

// main.js
const crypto = require('crypto');
console.info('crypto: ', crypto);

上述代码,在 webpack 打包的项目中,是可以正常运行的,在 vite 打包的项目中报错,报错如下

Error: module "crypto.js" is not defined

是不是在 vite 项目中,不能使用 crypto.js ?

fxy060608 commented 2 years ago

uuid@3.2.0 中使用 crypto.randomBytes 方法 uuid@8.3.2 中使用 crypto.randomFillSync 方法

// main.js
const crypto = require('crypto');
console.info('crypto: ', crypto);

上述代码,在 webpack 打包的项目中,是可以正常运行的,在 vite 打包的项目中报错,报错如下

Error: module "crypto.js" is not defined

是不是在 vite 项目中,不能使用 crypto.js ?

不要使用require方式引入,全部使用es6 module 下个版本会兼容uuid@3.2.1

sufuwang commented 2 years ago

不要使用require方式引入,全部使用es6 module 下个版本会兼容uuid@3.2.1

好的