Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/toyobayashi/asar-node

Enable require('./path/to/any-node-project.asar') & require('./path/to/any-node-project.asar/any/file'). Or just run asar-node ./path/to/any-node-project.asar
https://github.com/toyobayashi/asar-node

Last synced: 11 days ago
JSON representation

Enable require('./path/to/any-node-project.asar') & require('./path/to/any-node-project.asar/any/file'). Or just run asar-node ./path/to/any-node-project.asar

Awesome Lists containing this project

README

        

# asar-node

Enable `require('./path/to/any-node-project.asar')` & `require('./path/to/any-node-project.asar/any/file')` in your nodejs app.

## Usage

### CLI

``` bash
$ npm install -g asar-node
```

``` bash
$ asar-node ./path/to/any-node-project
$ asar-node ./path/to/any-node-project.asar

$ asar-node ./path/to/any-node-project.asar/any/file
$ asar-node ./path/to/any-node-project.asar/any/file.js
$ asar-node ./path/to/any-node-project.asar/any/file.json
$ asar-node ./path/to/any-node-project.asar/any/file.node
```

### Programming

``` bash
$ npm install asar-node
```

```js
require('asar-node').register()
// Equivalent to require('asar-node/lib/register.js').register()

require('./path/to/any-node-project') // like require a nodejs directory
// or require('./path/to/any-node-project.asar')
require('./path/to/any-node-project.asar/any/file')
```

If require a asar file, make sure there is `package.json` and `main` field or `index.js` / `index.json` / `index.node` in the asar root.

You can also pack `node_modules` into `node_modules.asar` instead of packing the hole project folder into an asar file.

To let node find modules from `node_modules.asar`, You should

``` js
const { register, addAsarToLookupPaths } = require('asar-node')
// Equivalent to
// const register = require('asar-node/lib/register.js').register
// const addAsarToLookupPaths = require('asar-node/lib/lookup.js').addAsarToLookupPaths

register()
addAsarToLookupPaths()

const Koa = require('koa') // koa is in node_modules.asar
```

In an electron project, it's unnecessary to call `register()` but you can also call `addAsarToLookupPaths()` to enable `node_modules.asar` support.

To disable asar support, you can set `process.noAsar = true` or `ELECTRON_NO_ASAR` environmnet variable.

## Migration

v1.x

``` js
require('asar-node')
```

v2.x / v3.x

``` js
require('asar-node/lib/autorun/index')
```

## Standalone builds

* `node_modules/asar-node/dist/index.js`

Library bundle.

```js
const {
register,
addAsarToLookupPaths
} = require('asar-node/dist/index.js')
// Equivalent to require('asar-node')
```

* `node_modules/asar-node/dist/asar-node.js`

CLI bundle.

```bash
$ node ./node_modules/asar-node/dist/asar-node.js [...]
# Equivalent to
$ asar-node [...]
```

* `node_modules/asar-node/dist/autorun.js`

Preload bundle.

```bash
$ node -r ./node_modules/asar-node/dist/autorun.js [...]
```

```js
require('asar-node/dist/autorun.js')
require('./path/to/app.asar/index.js')
```

```js
// app.asar/index.js
require('mod') // mod could be in node_modules.asar
```

* `node_modules/asar-node/dist/autorun-register.js`

Preload bundle without `node_modules.asar` support.

```bash
$ node -r ./node_modules/asar-node/dist/autorun-register.js [...]
```

```js
require('asar-node/dist/autorun-register.js')
require('./path/to/app.asar/index.js')
```

```js
// app.asar/index.js
require('mod') // throws error if mod is in node_modules.asar
```

* `node_modules/asar-node/dist/autorun-lookup.js`

Preload bundle with `node_modules.asar` support only, useful for electron environment.

```js
// webpack electron target
import 'asar-node/dist/autorun-lookup.js' // 1KB minified
```

## Available APIs inside asar

- `require('original-fs')`
- `fs.readFileSync` / `fs.readFile` / `fs.promises.readFile`
- `fs.statSync` / `fs.stat` / `fs.promises.stat`
- `fs.lstatSync` / `fs.lstat` / `fs.promises.lstat`
- `fs.readdirSync` / `fs.readdir` / `fs.promises.readdir`
- `fs.existsSync` / `fs.exists`
- `fs.accessSync` / `fs.access` / `fs.promises.access`
- `fs.realpathSync` / `fs.realpath` / `fs.realpathSync.native` / `fs.realpath.native` / `fs.promises.realpath`
- `fs.copyFileSync` / `fs.copyFile` / `fs.promises.copyFile`
- `fs.openSync` / `fs.open` / `fs.promises.open`
- `fs.createReadStream`
- `child_process.execFile`
- `child_process.execFileSync`

## Note

* **If your nodejs project use C++ native addons, please unpack it from asar file by specifying `--unpack=*.node` to [asar CLI](https://www.npmjs.com/package/asar)**
* **Express or Koa serving static file in asar file is not supported, but you can unpack the static file folder.**
* **Node.js ESM module is not support**