# vlang-loader
Webpack loader for the V programming language; supports V's JS backend and (soon) WASM  
https://npmjs.com/vlang-loader

### Usage

It's the same as other Webpack loader: just `npm install` it, and set it to compile your `.v` files inside your Webpack config:

```sh
$ npm install --save-dev vlang-loader
```

`webpack.config.js`:
```js
const path = require('path')

module.exports = {
    mode: 'production',
    entry: path.resolve('src/main.v'),
    module: {
        rules: [{ test: /\.v$/, use: 'vlang-loader' }]
    }
}
```

`src/main.v`:
```v
fn main() {
    println('Hello, Webpack + V.js!')
}
```

And that's all the setup you'll need. Run `npx webpack`, and you'll see Webpack's output JS file at `dist/main.js`.

As with other loaders, it can be chained, so (for example) you may use something like `UglifyJS` to further minify the output.

**Webpack's HMR also works**, so you'll be able to keep the convenience of having your page update automatically on every change. However, it reloads the page by default, since you need to call `module.hot.accept()` to allow HMR to happen.

This will be fixed in the future, but for now you can use this workaround:


`src/hmr/hmr.js.v`:
```v
module foo

pub fn accept() {
	#if (module.hot) module.hot.accept(() => true)
}
```

`src/main.v`:
```v
import foo

fn main() {
	println('Hello from Webpack + V.js + HMR!')
    hot.accept()
}
```


### Limitations
 - For now, you **need the V compiler installed**, since this module will look for a `v` executable in your PATH.
 - In the future (whenever V stabilizes a little), a WebAssembly compiled binary of the V compiler may be bundled along with this library, and used if the V compiler is not found.
 - This loader is just an integration between V and Webpack, so **any issues with V will also occur in this module**. If your code does not compile, first try to compile it with the regular V compiler. If that does not work either, report an issue in the [regular V repo](https://github.com/vlang/v). If it *does* work, open an issue here.


### TODOs
 - Implement WebAssembly generation via C->JS using `emscripten`
 - Implement code splitting per V module (`builtin` especially), to avoid bundling everything per output file. This will allow for smaller download sizes.


### Code structure

The loader itself is in `src`. The tests are located in `tests`, each subfolder is an independent project. They're all compiled separately, and their runtime output is compared to that of `expected_out.txt`.  
To run the tests, use `npm test`.

### Contributing

Contributions are welcome, but please make sure to keep the same code style (no semicolons, single quotes, tabs...)
