[NervJS/taro]用webpack5编译时可以使用node的原生模块crypto和zlib

2024-07-15 863 views
7

node的原生模块如crypto,zlib,buffer等不知道如何使用。webpack5官网介绍的方法无效,希望有个小程序的方法

希望文档中指出如何配置,或者可以直接使用

回答

3

你说的编译时指的打包编译过程,还是希望将 crypto 打包到运行时的包里?

0

应该开发和生产环境都需要吧。因为我们用到第三方数据接口,接口数据是经node原生模块zlib和crypto压缩并加密的。引入taro后,需要进行解压解密操作。之前用的taro 3.4.x + webpack4,开发和生产运行都能正常使用。

8

你直接提供一个 DEMO 吧,可以针对你的 demo 给一些配置的建议

3

大概如下,只要能正常使用下面方法即可(实际可能还使用到aes和md5算法)

import crypto from 'crypto';
import zlib from 'zlib';
import { Buffer } from 'buffer';

function decrypt(encrypted: string) {
    return zlib.gunzipSync(Buffer.from(encrypted, 'base64')).toString('utf-8');
}

function encrypt(text: string) {
    const o = Buffer.from(text).toString('base64');
    const m = crypto.createHmac('sha256', 'key');
    const h = m.update(o);
    return h.digest('base64');
}

如果不用webpack5官方配置,有类似crypto not found这样的提示,如果按webpack5官网方法配置,会提示util not found或process not found等错误

webpackChain(chain){
      chain.merge({
        resolve: {
          fallback: {
            zlib: require.resolve('browserify-zlib'),
            stream: require.resolve('stream-browserify'),
            util: require.resolve('util'),
            crypto: require.resolve('crypto-browserify'),
            buffer: require.resolve('buffer'),
            assert: require.resolve('assert'),
            process: require.resolve('process/browser')
          },
        },
      })
    }
3

没有人使用这些组件的吗?看来只能继续使用webpack4了

0

webpack-chain 暂时不支持 webpack5 新增的配置项 fallback,因此上面的配置是不可行的。

可以试一下这个:

const resolve = chain.resolve
resolve.set('fallback', {...})
1

额,好像也不行,因为最后 chain.toConfig() 的时候会调用到 resolve.toConfig(),而resolve.toConfig() 只返回支持的配置项。目前看没有很好的办法。

5

没有别的办法,就只能降到webpack4了

7

我先这么解决的..

webpackChain(chain){
   chain
    .plugin('ProvidePlugin')
    .use(require.resolve('webpack/lib/ProvidePlugin'), [{ 
      Buffer: ['buffer', 'Buffer'], 
      process: ['process/browser.js'] 
    }]);
}
4

See #13656

2

到现在还没支持fallback?我在用react-markdown 这个包也是 遇到好多问题

4

open for webpack 5 fallback 支持诉求.

9

我使用一些配置似乎是可以的,可以在 browser 环境下使用 crypto.

参考 https://juejin.cn/post/7095257275765358606 还需要 stream-browserify -> stream

...
    webpackChain(chain) {
      chain.plugin('unplugin-vue-components').use(Components({
        resolvers: [NutUIResolver({taro: true})]
      }))
      // NOT WORKING
      // chain.resolve.fallback = {
      //     crypto: require.resolve('crypto-browserify'),
      //     stream: require.resolve('stream-browserify'),
      // }
      // method1: WORKING
      chain.resolve.alias.set('crypto', require.resolve('crypto-browserify'))
      chain.resolve.alias.set('stream', require.resolve('stream-browserify'))
      // method2: WORKING
      // const resolve = chain.resolve
      // resolve.set('fallback', { 
      //   crypto: require.resolve('crypto-browserify'),
      //   stream: require.resolve('stream-browserify'),
      // })
    },
...