fuse-box
Version:
Fuse-Box a bundler that does it right
161 lines (115 loc) • 4.51 kB
Markdown
# Getting started
Before we proceed, let's make sure of that we are using NodeJS 8.2+ installed
## Assumptions
* What is bundling?
You are familiar with the term bundling, and you know why it's required
* What is npm?
You know what is NPM and how it works
## Hop on board
* Create `fuse.js`
* Define your producer
* Dev options
* bundle instructions
The initial configuration is quite simple.
```js
const { FuseBox, WebIndexPlugin } = require("fuse-box");
const fuse = FuseBox.init({
homeDir : "src",
target : 'browser',
output : "dist/$name.js",
plugins : [
WebIndexPlugin()
]
})
fuse.dev(); // launch http server
fuse.bundle("app").instructions(" > index.ts").hmr().watch()
fuse.run();
```
This will get you started pretty much instantly. `index.html` will be created automatically.
In this example we are using typescript, if you don't have `tsconfig.json` FuseBox creates one automatically for you.
## Choosing correct target
It's important to setup correct script and platform target for your bundle.
```js
const fuse = FuseBox.init({
target : 'browser',
homeDir : "src",
output : "dist/$name.js"
});
```
Let's take a look at the first option here - `target`. It can be `browser` or `server` you can also set `universal`, however if you want to have platform optimised bundles you should choose either `server` or `browser`. You can control the script target by adding `@` symbol. For example: `browser` or `server`
FuseBox detects the actual target of files, so when you choose `es5` and a script is using `es6` feature, TypeScript transpiler will transpile it down.
## Start with TypeScript
You won't need any additional configuration to start working with typescript.
* Make sure to choose the correct [target](#choosing-correct-target)
* `tsconfig.json` will be created automatically if none was found
## Start with JavaScript
You can not forced to used typescript. However you should still have it installed, as typescript is not just a powerful tool for typechecking - it's also a very [powerful transpiler](/page/configuration#usetypescriptcompiler) too
```js
const fuse = FuseBox.init({
homeDir : "src",
target : 'browser',
output : "dist/$name.js",
useTypescriptCompiler : true,
});
fuse.bundle("app")
.instructions(" > index.js").hmr().watch()
fuse.run();
```
Use `useTypescriptCompiler` option and you won't need babel at all. But keep in my synthetic default imports.
Correct:
```js
import * as React from "react"
```
NOT correct:
```js
import React from "react" // <-- not correct ()
```
It will work with [polyfillNonStandardDefaultUsage](/page/configuration#polyfillnonstandarddefaultusage). However it's not recommended to add this option as it adds additional overhead to your runtime.
## Start with CSS
Adding CSS support it very easy.
```js
const { FuseBox, SassPlugin, CSSPlugin } = require("fuse-box");
const fuse = FuseBox.init({
target : 'browser',
homeDir : "src",
output : "dist/$name.js",
plugins : [
[ SassPlugin(), CSSPlugin() ]
]
});
```
But before you start experimenting, you should read [this](/page/about-plugins) section in order to understand how plugins work. The common mistake made by rookies is not grouping (chaining) the plugins.
```js
plugins : [
[ SassPlugin(), CSSPlugin() ]
]
```
## Start with server
In order to achieve the best performance you should choose `server` target
```js
const fuse = FuseBox.init({
homeDir : "src",
target : 'server',
output : "dist/$name.js"
});
fuse.bundle("app")
.completed(proc => proc.start)
.instructions(" > index.ts").hmr().watch()
fuse.run();
```
FuseBox can take care of launching your server bundle. `.completed(proc => proc.start)` block will start/restart the process automatically.
## Making production builds
Production builds are made using the [Quantum](/page/quantum) plugin.
```js
plugins: [
this.isProduction && QuantumPlugin({
uglify: true,
treeshake : true,
bakeApiIntoBundle: "app"
})
]
```
Before going there, read up [how to deal with the task runner](/page/getting-started-with-sparky) as it will greatly simplify the workflow.
## Diving deeper
Once you are familiar with the concepts, you can start with [Sparky](/page/sparky) - A task runner that makes you life easier.
You can find plenty of example [here](https://github.com/fuse-box/fuse-box-examples/tree/master/examples]