Base64 Encoding Libraries Comparison
js-base64 vs btoa vs base-64
1 Year
js-base64btoabase-64Similar Packages:
What's Base64 Encoding Libraries?

Base64 encoding libraries are essential tools in web development for converting binary data into a text format that can be easily transmitted over media that are designed to deal with textual data. They are commonly used in data transmission, storage, and embedding binary data in text-based formats such as JSON or XML. These libraries provide different implementations and functionalities for encoding and decoding Base64, which is crucial for handling data securely and efficiently in web applications.

NPM Package Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
js-base645,452,1444,28138.6 kB910 months agoBSD-3-Clause
btoa3,717,841---7 years ago(MIT OR Apache-2.0)
base-642,647,673513-124 years agoMIT
Feature Comparison: js-base64 vs btoa vs base-64

Encoding and Decoding

  • js-base64:

    The js-base64 library offers both encoding and decoding functions, supporting a variety of input types including strings and binary data. It also includes options for handling UTF-8 encoding, making it versatile for different use cases.

  • btoa:

    The btoa function is a built-in JavaScript function that encodes a string in Base64. It is limited to encoding only strings and does not provide decoding capabilities, which means you will need alternative methods for decoding.

  • base-64:

    The base-64 package provides simple methods for encoding and decoding data to and from Base64 format. It is designed to be minimalistic and efficient, making it suitable for quick tasks without overhead.

Browser Compatibility

  • js-base64:

    The js-base64 library is designed to work seamlessly in both Node.js and browser environments, ensuring that developers can use it regardless of the platform.

  • btoa:

    The btoa function is only available in browser environments, which limits its use in server-side applications. It is not suitable for Node.js without polyfills or additional libraries.

  • base-64:

    The base-64 package is compatible with both Node.js and browser environments, providing a consistent API across platforms. This makes it a good choice for applications that run in multiple environments.

Performance

  • js-base64:

    The js-base64 library is designed for performance and can handle larger data sets efficiently. It may have a slight overhead compared to the native btoa function, but it compensates with its additional features.

  • btoa:

    The performance of btoa is generally good for small strings, but it may not be as efficient for larger data sets due to its limitations in handling binary data and lack of decoding capabilities.

  • base-64:

    The base-64 package is optimized for performance, providing fast encoding and decoding operations with minimal overhead. It is suitable for applications that require high throughput and low latency.

Ease of Use

  • js-base64:

    The js-base64 library provides a user-friendly API with clear documentation, making it easy to implement both encoding and decoding in projects. It is well-suited for developers who need a robust solution.

  • btoa:

    Using btoa is very simple for encoding strings, but its lack of decoding functionality can complicate workflows that require both operations. It is easy to use but limited in scope.

  • base-64:

    The base-64 package offers a straightforward API that is easy to use, making it accessible for developers of all skill levels. Its simplicity allows for quick integration into projects.

Additional Features

  • js-base64:

    The js-base64 library includes additional features such as UTF-8 support and the ability to handle binary data, making it a more versatile option for developers who need more than just basic encoding and decoding.

  • btoa:

    The btoa function is a basic utility with no additional features, which may limit its use in more complex scenarios that require decoding or handling of binary data.

  • base-64:

    The base-64 package focuses solely on Base64 encoding and decoding, without additional features. It is ideal for projects that require a lightweight solution without extra functionalities.

How to Choose: js-base64 vs btoa vs base-64
  • js-base64:

    Choose js-base64 if you require a comprehensive solution that supports both encoding and decoding of Base64 data, along with additional features like UTF-8 support. It is well-suited for projects that need to handle various types of data and offers a more robust API.

  • btoa:

    Choose btoa if you are working in a browser environment and need a native method for Base64 encoding. It is built into the browser's JavaScript environment, making it a good choice for quick implementations without additional dependencies, but it lacks decoding functionality.

  • base-64:

    Choose base-64 if you need a simple and lightweight solution for encoding and decoding Base64 data in both Node.js and browser environments. It is straightforward and has minimal dependencies, making it ideal for small projects.

README for js-base64

CI via GitHub Actions

base64.js

Yet another Base64 transcoder.

Install

$ npm install --save js-base64

Usage

In Browser

Locally…

<script src="base64.js"></script>

… or Directly from CDN. In which case you don't even need to install.

<script src="https://cdn.jsdelivr.net/npm/js-base64@3.7.7/base64.min.js"></script>

This good old way loads Base64 in the global context (window). Though Base64.noConflict() is made available, you should consider using ES6 Module to avoid tainting window.

As an ES6 Module

locally…

import { Base64 } from 'js-base64';
// or if you prefer no Base64 namespace
import { encode, decode } from 'js-base64';

or even remotely.

<script type="module">
// note jsdelivr.net does not automatically minify .mjs
import { Base64 } from 'https://cdn.jsdelivr.net/npm/js-base64@3.7.7/base64.mjs';
</script>
<script type="module">
// or if you prefer no Base64 namespace
import { encode, decode } from 'https://cdn.jsdelivr.net/npm/js-base64@3.7.7/base64.mjs';
</script>

node.js (commonjs)

const {Base64} = require('js-base64');

Unlike the case above, the global context is no longer modified.

You can also use esm to import instead of require.

require=require('esm')(module);
import {Base64} from 'js-base64';

SYNOPSIS

let latin = 'dankogai';
let utf8  = '小飼弾'
let u8s   =  new Uint8Array([100,97,110,107,111,103,97,105]);
Base64.encode(latin);             // ZGFua29nYWk=
Base64.encode(latin, true);       // ZGFua29nYWk skips padding
Base64.encodeURI(latin);          // ZGFua29nYWk
Base64.btoa(latin);               // ZGFua29nYWk=
Base64.btoa(utf8);                // raises exception
Base64.fromUint8Array(u8s);       // ZGFua29nYWk=
Base64.fromUint8Array(u8s, true); // ZGFua29nYW which is URI safe
Base64.encode(utf8);              // 5bCP6aO85by+
Base64.encode(utf8, true)         // 5bCP6aO85by-
Base64.encodeURI(utf8);           // 5bCP6aO85by-
Base64.decode(      'ZGFua29nYWk=');// dankogai
Base64.decode(      'ZGFua29nYWk'); // dankogai
Base64.atob(        'ZGFua29nYWk=');// dankogai
Base64.atob(        '5bCP6aO85by+');// '小飼弾' which is nonsense
Base64.toUint8Array('ZGFua29nYWk=');// u8s above
Base64.decode(      '5bCP6aO85by+');// 小飼弾
// note .decodeURI() is unnecessary since it accepts both flavors
Base64.decode(      '5bCP6aO85by-');// 小飼弾
Base64.isValid(0);      // false: 0 is not string
Base64.isValid('');     // true: a valid Base64-encoded empty byte
Base64.isValid('ZA=='); // true: a valid Base64-encoded 'd'
Base64.isValid('Z A='); // true: whitespaces are okay
Base64.isValid('ZA');   // true: padding ='s can be omitted
Base64.isValid('++');   // true: can be non URL-safe
Base64.isValid('--');   // true: or URL-safe
Base64.isValid('+-');   // false: can't mix both

Built-in Extensions

By default Base64 leaves built-in prototypes untouched. But you can extend them as below.

// you have to explicitly extend String.prototype
Base64.extendString();
// once extended, you can do the following
'dankogai'.toBase64();        // ZGFua29nYWk=
'小飼弾'.toBase64();           // 5bCP6aO85by+
'小飼弾'.toBase64(true);       // 5bCP6aO85by-
'小飼弾'.toBase64URI();        // 5bCP6aO85by- ab alias of .toBase64(true)
'小飼弾'.toBase64URL();        // 5bCP6aO85by- an alias of .toBase64URI()
'ZGFua29nYWk='.fromBase64();  // dankogai
'5bCP6aO85by+'.fromBase64();  // 小飼弾
'5bCP6aO85by-'.fromBase64();  // 小飼弾
'5bCP6aO85by-'.toUint8Array();// u8s above
// you have to explicitly extend Uint8Array.prototype
Base64.extendUint8Array();
// once extended, you can do the following
u8s.toBase64();     // 'ZGFua29nYWk='
u8s.toBase64URI();  // 'ZGFua29nYWk'
u8s.toBase64URL();  // 'ZGFua29nYWk' an alias of .toBase64URI()
// extend all at once
Base64.extendBuiltins()

.decode() vs .atob (and .encode() vs btoa())

Suppose you have:

var pngBase64 = 
  "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";

Which is a Base64-encoded 1x1 transparent PNG, DO NOT USE Base64.decode(pngBase64).  Use Base64.atob(pngBase64) instead.  Base64.decode() decodes to UTF-8 string while Base64.atob() decodes to bytes, which is compatible to browser built-in atob() (Which is absent in node.js).  The same rule applies to the opposite direction.

Or even better, Base64.toUint8Array(pngBase64).

Brief History

  • Since version 3.3 it is written in TypeScript. Now base64.mjs is compiled from base64.ts then base64.js is generated from base64.mjs.
  • Since version 3.7 base64.js is ES5-compatible again (hence IE11-compatible).
  • Since 3.0 js-base64 switch to ES2015 module so it is no longer compatible with legacy browsers like IE (see above)