js中如何生成条形码

大神们有没有人讲详细点的我想说明下,js中如何生成条形码
最新回答
夏了夏天

2026-04-17 13:35:50

在JavaScript中生成条形码通常依赖现成库,以下介绍常用库及其使用方法、选择建议、框架集成方式、错误处理和性能优化策略。

常用条形码生成库1. JsBarcode
  • 特点:简单易用,支持多种格式(如EAN13、CODE128),文档完善,适合大多数场景。
  • 安装:

    npm安装:npm install jsbarcode

    CDN引入:<script src="

    https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js"></script>

  • 使用示例:<svg id="barcode"></svg><script> JsBarcode("#barcode", "1234567890", { format: "EAN13", displayValue: true, fontSize: 20 });</script>

    效果:生成EAN13格式条形码,数据为1234567890,下方显示数据。

  • 优点:支持SVG渲染,兼容性较好(需注意老旧浏览器可能需要polyfill)。
  • 缺点:依赖SVG,复杂场景需额外处理。
2. QuaggaJS
  • 特点:主打条形码扫描,生成功能较弱,适合扫描后结果展示。
  • 安装:npm install quagga
  • 使用:生成功能不如JsBarcode直接,通常用于解码场景。
  • 优点:扫描功能强大,可辅助生成简单条形码。
  • 缺点:生成功能有限,不推荐专门用于生成。
3. bwip-js
  • 特点:功能强大,支持复杂条形码生成(如Code128、QR码),但配置复杂。
  • 安装:npm install bwip-js
  • 使用示例:var bwipjs = require('bwip-js');bwipjs.toCanvas({ output: 'barcodeCanvas', bcid: 'code128', text: '0123456789', scale: 3, height: 10, includetext: true, textxalign: 'center'}, function(err, cvs) { if (err) console.error(err); else console.log('条形码生成成功');});

    效果:生成Code128格式条形码,绘制到id="barcodeCanvas"的Canvas元素上。

  • 优点:高度可定制,支持多种复杂格式。
  • 缺点:配置复杂,需手动处理渲染逻辑。

如何选择合适的库?
  • 简单需求:选JsBarcode,支持主流格式且易用。
  • 扫描为主:选QuaggaJS,兼顾生成与扫描。
  • 复杂需求:选bwip-js,需精细控制条形码样式和格式。
在不同框架中集成条形码库1. React
  • 核心思路:利用useEffect在组件挂载后生成条形码。
  • 示例:import { useEffect, useRef } from 'react';import JsBarcode from 'jsbarcode';function BarcodeComponent({ data }) { const svgRef = useRef(null); useEffect(() => { if (svgRef.current) { JsBarcode(svgRef.current, data, { format: 'CODE128' }); } }, [data]); return <svg ref={svgRef} />;}
2. Vue
  • 核心思路:在mounted生命周期钩子中生成条形码。
  • 示例:<template> <svg ref="barcodeSvg"></svg></template><script>import JsBarcode from 'jsbarcode';export default { props: ['data'], mounted() { JsBarcode(this.$refs.barcodeSvg, this.data, { format: 'EAN13' }); }};</script>
3. Angular
  • 核心思路:在AfterViewInit生命周期钩子中生成条形码。
  • 示例:import { Component, AfterViewInit, ElementRef } from '@angular/core';import JsBarcode from 'jsbarcode';@Component({ selector: 'app-barcode', template: `<svg #barcode></svg>`})export class BarcodeComponent implements AfterViewInit { @ViewChild('barcode') barcodeEl: ElementRef; constructor() {} ngAfterViewInit() { JsBarcode(this.barcodeEl.nativeElement, '1234567890', { format: 'CODE39' }); }}

错误处理与异常捕获
  • 常见错误:

    数据格式错误:如传入非数字字符生成EAN13。

    库加载失败:CDN资源404或npm包未安装。

    渲染错误:SVG/Canvas元素未正确获取或绘制失败。

  • 处理方式:

    try-catch:捕获生成逻辑中的异常。try { JsBarcode('#barcode', invalidData, { format: 'EAN13' });} catch (e) { console.error('条形码生成失败:', e.message);}

    默认值回退:生成失败时显示默认条形码或错误提示。

性能优化策略
  • 缓存机制:对相同数据缓存条形码,避免重复生成。const barcodeCache = new Map();function getBarcode(data) { if (barcodeCache.has(data)) return barcodeCache.get(data); const svg = document.createElement('svg'); JsBarcode(svg, data, { format: 'CODE128' }); barcodeCache.set(data, svg.outerHTML); return svg.outerHTML;}
  • Web Worker:将生成逻辑放到Web Worker中,避免阻塞主线程。// main.jsconst worker = new Worker('barcode-worker.js');worker.postMessage({ data: '1234567890', format: 'EAN13' });worker.onmessage = (e) => { document.getElementById('barcode').innerHTML = e.data;};// barcode-worker.jsimportScripts('
    https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js'
    );self.onmessage = (e) => { const { data, format } = e.data; const svg = document.createElement('svg'); JsBarcode(svg, data, { format }); self.postMessage(svg.outerHTML);};
  • 优化配置:根据需求选择合适格式(如CODE128比EAN13更节省空间),减少不必要的计算。
总结
  • 推荐库:优先选JsBarcode,简单场景下平衡易用性与功能。
  • 框架集成:结合生命周期钩子或Ref获取DOM元素,确保生成时机正确。
  • 错误处理:通过try-catch和默认值回退提升健壮性。
  • 性能优化:缓存、Web Worker和配置优化可显著提升生成效率