Corepack

and Node.js LTS 16

JaxNode October 2021

Topics

  • Node.js 16 LTS
  • Corepack
  • Yarn
  • PNPM

About Me

fek.io/blog

youtube.com/c/polyglotengineer

github.com/davidfekke

@jaxnode @polyglotengine1

Node 16 LTS

  • Node 16 is the stable version
  • Node 17 will be R&D version

LTS Schedule

Node.js 17

  • OpenSSL 3.0
  • V8 v9.5
  • Readline Promise API
import * as readline from 'node:readline/promises';
import { stdin as inp, stdout as outp } from 'process';

const rdln = readline.createInterface({ inp, outp });

const answer = await rdln.question('What do you think of JaxNode? ');

console.log(`Thank you for your valuable feedback: ${answer}`);

rdln.close();

Readline Promise API

Node 16 Features

  • Apple ARM64 support
  • New V8
  • New Regex functions
  • Stable Timer Promises API
  • Web Crypto API
  • New Node-API C methods
  • AbortController API
  • atob and btoa support
  • Source Maps v3

V8 9.5

  • New Regex Indices /d
  • Faster Js-to-Wasm calls
  • Use experimental --turbo-inline-js-wasm-calls

Stable Timer Promises

  • Exists under 'timer/promises'
  • Use this for using timers within Async/Await
import { setTimeout } from 'timers/promises';

async function doSomething() {
  console.log('doSomething started!');
  await setTimeout(2000);
  console.log('Delayed Timers!');
}
doSomething();

Web Crypto API

  • Newer version of the Crypto API
  • All new features under `subtle` interface
  • Many versions of `Crypto` 
  • Standardizing and a single Standard

Web Crypto Example

import { webcrypto } from 'crypto';
const { subtle } = webcrypto;

(async function() {

  const key = await subtle.generateKey({
    name: 'HMAC',
    hash: 'SHA-256',
    length: 256
  }, true, ['sign', 'verify']);

  const digest = await subtle.sign({
    name: 'HMAC'
  }, key, 'I love node.js');

  console.log(digest);
})();

N-API now Node-API

  • The way you extend Node with C/C++
  • napi_add_async_cleanup_hook
  • napi_object_freeze
  • napi_object_seal
  • napi_type_tag_object
  • napi_check_object_type_tag
  • napi_type_tag

AbortController

  • Actually part of Node 15
  • Use { once: true } option in Event Listeners
const abortC = new AbortController();
abortC.signal.addEventListener('abort', () => {
    console.log('Just cancelled')
}, { once: true });
abortC.abort();
console.log(abortC.signal.aborted);

atob and btoa Added

  • atob and btoa added to Node for JS compatibility
  • Used for converting Base64
  • DO NOT USE THESE NEW FUNCTIONS
  • There is a better way
const str = 'Hello JavaScript Developer!';

const strBuf = Buffer.from(str, 'utf8');
console.log(strBuf);
// <Buffer 1d e9 65 a0 96 af 69 27 2b 8a 9b 43 7a f7 a5 a2 97 ab>

const base64Buf = Buffer.from(strBuf, 'base64');
const base64Str = base64Buf.toString('base64');
console.log(base64Str);
// SGVsbG8gSmF2YVNjcmlwdCBEZXZlbG9wZXIh

const bufFromBase64Str = Buffer.from(base64Str, 'base64');

const decodedStr = bufFromBase64Str.toString('utf-8');
console.log(decodedStr);
// Hello JavaScript Developer!
console.log(str === decodedStr);
// true

Other Features

  • npm v8.0.0
  • Source Maps v3
  • process.binding() has been deprecated

Corepack

  • Zero runtime dependency Node script
  • Allows third party package managers with out having to have them preinstalled
  • Support for Yarn, PNPM and NPM

Enabling Corepack

  • > corepack enable
  • Can also enable specific package manager
  • > corepack enable yarn
  • > corepack diable

Activating Corepack

  • Can activate a specific package manager
  • > corepack prepare yarn@1.22.11 --activate

Using pkg managers

  • corepack yarn or pnpm
  • > yarn add axios
  • becomes
  • > corepack yarn add axios 

Package.json setting

  • Specify package manager and version in the package.json file
  • New key "packageManager"
{
  "name": "sampleproject",
  "version": "1.0.0",
  "main": "index.js",
  "type": "module",
  "license": "MIT",
  "scripts": {
    "start": "node index.js"
  },
  "packageManager": "yarn@1.22.11",
  "dependencies": {
    "axios": "^0.21.4"
  }
}

Archiving and Distribution

  • Use prepare command
  • > corepack prepare yarn@1.22.11 --activate -o
  • Will Create compressed TGZ file called corepack.tgz
  • When deploying use `hydrate` command to deploy corepack archive
  • > corepack hydrate --activate corepack.tgz 

Resources

Questions?

Made with Slides.com