https://github.com/WebReflection/asbundle
A minimalistic JS bundler
https://github.com/WebReflection/asbundle
Last synced: 10 months ago
JSON representation
A minimalistic JS bundler
- Host: GitHub
- URL: https://github.com/WebReflection/asbundle
- Owner: WebReflection
- License: isc
- Created: 2017-10-18T11:25:10.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2020-09-10T06:25:35.000Z (over 5 years ago)
- Last Synced: 2025-03-27T14:11:09.184Z (10 months ago)
- Language: JavaScript
- Homepage:
- Size: 193 KB
- Stars: 79
- Watchers: 2
- Forks: 3
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- awesome-list - asbundle
README
# asbundle
[](https://github.com/WebReflection/donate) [](https://opensource.org/licenses/ISC) [](https://travis-ci.org/WebReflection/asbundle) [](https://greenkeeper.io/)
A minimalistic CommonJS bundler.
- - -
This module is a perfect [ascjs](https://github.com/WebReflection/ascjs) companion to create CommonJS bundles.
Passing a single ESM/CJS source file as path name, it will produce a lightweight, optimized, and minifier friendly bundle,
to consume right away without needing global `require` or runtime discovered CommonJS dependencies.
### Goals
* be as simple as possible, but not simpler
* make creation of small modules written in ESM a no brainer
* enable `.js` files as ESM everywhere, following a simple folder convention
* produce files compatible with most common bundlers and tools (Babel, Webpack, UglifyJS, etc)
**Example** of a basic module based on _ascjs_ and _asbundle_.

### Non-Goals
* replace Babel, Webpack, Rollup, or any other tool. Let them do complicated things when needed
* transpile anything else than ESM import/export declarations
## How to
You can use _asbundle_ as binary utility or as module.
```sh
npm install -g asbundle
# to see what you can do
asbundle --help
```
As executable, you can use _asbundle_ to output, or save, a bundle entry point.
```sh
asbundle source-file.js # writes bundle contents to STDOUT
asbundle source-file.js bundle.js # outputs to bundle.js
```
As module, you can require it and use it to obtain a bundle string.
```js
const asbundle = require('asbundle');
asbundle(sourceFileName);
```
### Features
* extremely lightweight, based on [babylon](https://github.com/babel/babylon) for performance and reliability
* it uses _ascjs_ to automatically transform, when needed, ES2015+ modules into CommonJS code
* understands both relative files and installed packages too (based on `require.resolve(...)`)
* reproduces a modern and minimalistic CommonJS environments ideal for browsers
* compatible with [Babel](http://babeljs.io) `__esModule` and `.default` convention
### Constrains
* same constrains of [ascjs](https://github.com/WebReflection/ascjs#constrains)
* Node core modules are not brought to the bundle, if a module cannot be resolved as file name it throws
### Example
This module can transform `main.js` entry file via `asbundle main.js out.js`:
```js
// main.js
import func, {a, b} from './module.js';
const val = 123;
export default function test() {
console.log('asbundle');
};
export {func, val};
// module.js
export const a = 1, b = 2;
export default function () {
console.log('module');
};
```
into the following bundle:
```js
// out.js => 266 bytes minified & gzipped
(function (cache, modules) {
function require(i) { return cache[i] || get(i); }
function get(i) {
var exports = {}, module = {exports: exports};
modules[i].call(exports, window, require, module, exports);
return (cache[i] = module.exports);
}
var main = require(0);
return main.__esModule ? main.default : main;
}([],[function (global, require, module, exports) {
// main.js
'use strict';
const func = (m => m.__esModule ? m.default : m)(require(1));
const {a, b} = require(1);
const val = 123;
function test() {
console.log('asbundle');
}
Object.defineProperty(exports, '__esModule', {value: true}).default = test;
exports.func = func;
exports.val = val;
},function (global, require, module, exports) {
// module.js
'use strict';
const a = 1, b = 2;
exports.a = a;
exports.b = b;
Object.defineProperty(exports, '__esModule', {value: true}).default = function () {
console.log('module');
};
}]));
```
The main module is returned and executed as default entry so it becomes easy to publish as global variable for Web purposes too.
Add a `const myModule = ` prefix to the bundled code and use it right away.