Skip to content

Latest commit

 

History

History

v8-snapshot-require

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

@packages/v8-snapshot-require

Tool to load a snapshot for Electron applications that was created by @tooling/v8-snapshot.

Table of Contents

Features

@packages/v8-snapshot-require provides modules snapshotted by @tooling/v8-snapshot to @packages/packherd-require and helps in locating modules to load from the snapshot by deriving their keys from information about each module provided by packherd.

Loading From Snapshot

In order to facilitate loading from the snapshot, @packages/v8-snapshot-require ties into the @packages/packherd-require resolution mechanism in order to help it obtain the key to locate a fully initialized module exports or its definition from the snapshotted Object that @packages/v8-snapshot-require also provides during @packages/packherd-require initialization inside the snapshot-require setup.

It uses the resolver-map in order to resolve modules without querying the file system.

Once v8-snapshot provides this key to packherd it then tries to first load a fully initialized version of the module, aka exports, falling back to a function which will initialize it, aka definitions and only finally loads it from the file system via Node.js.

Most of that logic lives inside @packages/packherd-require and it is recommended to read its documentation.

Resolver Map

The resolver map is constructed from metadata that as esbuild-snap produces as a side effect of bundling the application's dependencies and optionally the app's modules.

The keys of this map are the directory relative to the project base dir, from which a module was resolved, concatenated with the import request string (separated by '***') and the value the fully resolved path relative to the project base dir.

This map is embedded into the snapshot and used fast module key resolution and used to resolve a module's key via the getModuleKey function.

Examples

In order to learn how to orchestrate snapshot creation and loading please have a look at the examples provided with this app, for instance:

Debugging and Diagnosing

In order to gain insight into how the modules are loaded please set the DEBUG=(cypress:pack|cypress:snap)* which will cause the tool to emit a wealth of information part of which will provide insight into how many modules were initialized from the snapshot and which weren't.

cypress:packherd:debug { exportHits: 20, definitionHits: 8, misses: 3 }

It will also provide information about what it encountered inside the snapshot, namely the number of:

  • exports modules that are fully initialized inside the snapshot
  • definitions functions that will return module.exports when invoked

NOTE: that definitions and exports overlap as a module's definition is always included even if its export is included as well.

Thus the below means that we have 12 modules that are included fully initialized and 6 (18 - 12) that aren't.

exports: 12
definitions: 18