在很久很久以前,我亲爱的同事们在对接二维码扫描业务的时候,都是使用的微信官方自带的扫一扫,比如这样

 1wx.scanQRCode({
 2  needResult: 0, 
 3  scanType: ["qrCode","barCode"], 
 4  success: function (res) {
 5    var result = res.resultStr; 
 6  }
 7});

所以我扫码就一定得依赖微信,在普通的浏览器中打开就GG,并且还要绑定公众号,烦的一批。

然后我就在想,扫码不就是靠摄像头捕捉图像进行解码出内容嘛,那肯定会有原生的解决方案。

Google Google Google Google ......

果然是有的,Web API中也提供了一个实验性的功能,Barcode Detection API

它提供了一个detect方法,可以接收图片元素、图片二进制数据或者是ImageData,最终返回一个包含码信息的Promise对象。

但是呢,这个功能的浏览器兼容性比较差,看了caniuse,心凉了一半。

但我相信大神们肯定有自己的解决方案,继续Google呗。

Google Google Google Google ......

还真有这么一个库,html5-qrcode,它在zxing-js的基础之上,又增加了对多种码制的解码支持,站在巨人的肩膀上又跟高了一层。

html5-qrcode支持的码有:

CodeExample
QR Code[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2Fa10055511dd2a9c0364b9f5cf4cd9e923f4b8a8608a6182e101c164815d28507%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f71722d636f64652e706e67https://camo.githubusercontent.com/a10055511dd2a9c0364b9f5cf4cd9e923f4b8a8608a6182e101c164815d28507/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f71722d636f64652e706e67”)
AZTEC[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2Fa1df935ae19e5f3f60e37bbf52780ab4211747eb657f3216b4563919e47fa270%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f617a7465632e706e67https://camo.githubusercontent.com/a1df935ae19e5f3f60e37bbf52780ab4211747eb657f3216b4563919e47fa270/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f617a7465632e706e67”)
CODE_39[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F5de37da48f6fe04ca0dd936bb04570cf0f2457c7f0b00c18ad51f77687d44b95%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f636f64655f33392e676966https://camo.githubusercontent.com/5de37da48f6fe04ca0dd936bb04570cf0f2457c7f0b00c18ad51f77687d44b95/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f636f64655f33392e676966”)
CODE_93[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2Ff353b16bc82345960632a9edff028a78af39e1c65e173a133a484972617ced5c%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f636f64655f39332e676966https://camo.githubusercontent.com/f353b16bc82345960632a9edff028a78af39e1c65e173a133a484972617ced5c/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f636f64655f39332e676966”)
CODE_128[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F94075b758f94ccef9f2bc202cce2afb72a2ac8e82f48aa97f6d0c510d6a70d86%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f636f64655f3132382e676966https://camo.githubusercontent.com/94075b758f94ccef9f2bc202cce2afb72a2ac8e82f48aa97f6d0c510d6a70d86/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f636f64655f3132382e676966”)
ITF[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F05160372590fdaa2a3984ab480aa62a2a46b8a8d17b004e2b32fbd3d578a15f6%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f6974662e706e67https://camo.githubusercontent.com/05160372590fdaa2a3984ab480aa62a2a46b8a8d17b004e2b32fbd3d578a15f6/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f6974662e706e67”)
EAN_13[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F35c4033f1122effa8093a1fe1ac485e946483848dcdb03d02eb2254e348e0cc0%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f65616e31332e6a706567https://camo.githubusercontent.com/35c4033f1122effa8093a1fe1ac485e946483848dcdb03d02eb2254e348e0cc0/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f65616e31332e6a706567”)
EAN_8[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F8a614e4979db4f60a1cfbfc83d81995751487745914fbd984e97caa43fb14a20%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f65616e382e6a706567https://camo.githubusercontent.com/8a614e4979db4f60a1cfbfc83d81995751487745914fbd984e97caa43fb14a20/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f65616e382e6a706567”)
PDF_417[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2Fac700f21bdb17f4a3b75cfcc2bf06ecf9879f103bf9df46f8d0d6cd28570271d%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f7064663431372e706e67https://camo.githubusercontent.com/ac700f21bdb17f4a3b75cfcc2bf06ecf9879f103bf9df46f8d0d6cd28570271d/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f7064663431372e706e67”)
UPC_A[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F81c9e26c8815b36fc88893c9bea184f42c34caed38ccf80c04309fcc3b1c6e96%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f757063612e6a706567https://camo.githubusercontent.com/81c9e26c8815b36fc88893c9bea184f42c34caed38ccf80c04309fcc3b1c6e96/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f757063612e6a706567”)
UPC_E[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2Fdbe76b09d3dd59d5c84332429e217e70b74fd8b3dfb379b3730740b9ddb1ab7a%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f757063652e6a706567https://camo.githubusercontent.com/dbe76b09d3dd59d5c84332429e217e70b74fd8b3dfb379b3730740b9ddb1ab7a/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f757063652e6a706567”)
DATA_MATRIX[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F61dbafbd033698b33c572c52243b0ea7469cbf5f259aa3cc4f8c5456b9c309b4%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f646174616d61747269782e706e67https://camo.githubusercontent.com/61dbafbd033698b33c572c52243b0ea7469cbf5f259aa3cc4f8c5456b9c309b4/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f646174616d61747269782e706e67”)
MAXICODE*[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F6cf7d4dc8b7c2c17c24247214e22f0f05adbb277740bfcfc6c1314456ab1cee4%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f6d617869636f64652e676966https://camo.githubusercontent.com/6cf7d4dc8b7c2c17c24247214e22f0f05adbb277740bfcfc6c1314456ab1cee4/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f6d617869636f64652e676966”)
RSS_14*[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2Ffe9c28d8b23903fe6e5d3fb56c359c54d1e343edecea0d4bf258bb1464006fa8%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f72737331342e676966https://camo.githubusercontent.com/fe9c28d8b23903fe6e5d3fb56c359c54d1e343edecea0d4bf258bb1464006fa8/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f72737331342e676966”)
RSS_EXPANDED*[
](https://link.juejin.cn/?target=https%3A%2F%2Fcamo.githubusercontent.com%2F21b1dd260a27190eefca7fd068769bcccb1102b9a97c504f387d1f930731bd34%2F68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f727373657870616e6465642e676966https://camo.githubusercontent.com/21b1dd260a27190eefca7fd068769bcccb1102b9a97c504f387d1f930731bd34/68747470733a2f2f7363616e6170702e6f72672f6173736574732f6769746875625f6173736574732f727373657870616e6465642e676966”)

我个人觉得非常够用了,平时用的最多的还是二维码、条形码,其他的码也都少见。

关键是人家还支持了各种浏览器,可以说已经是很良心了(什么UC浏览器的,其实我都瞧不上,不支持就不支持,无所吊谓)

来看看官方提供的demo效果

好好好,很棒。但是他们没有提供框架支持,那么我又可以站在巨人的肩膀上的巨人的肩膀上造轮子了。

先来看看我自己封装的React组件

使用方法也简单

 1function App() {
 2  const scanCodeRef = useRef();
 3  const [scanResult, setScanResult] = useState('');
 4
 5  function startScan() {
 6    scanCodeRef.current?.initScan();
 7  }
 8
 9  return (
10    <div>
11      <button onClick={startScan}>扫一扫</button>
12      <p>扫描结果: {scanResult}</p>
13      <ScanQrCodeH5
14        ref={scanCodeRef}
15        scanTips="请一定要对准二维码哦~"
16        onScanSuccess={(text) => {
17          setScanResult(text);
18        }}
19        // onScanError={(err) => {
20        //   console.log(err);
21        // }}
22      />
23    </div>
24  );
25}

三二一,上链接,rc-qrcode-scan

这次的版本没有加入从相册选择图片进行解码,下个版本将会加入,希望能帮到掘友们。

2023-09-28更新,掘友们我把从相册选择加进去了。

个人笔记记录 2021 ~ 2025