vlang-loader
Version:
Webpack loader for the V programming language; supports JS and WASM builds
81 lines (56 loc) • 2.69 kB
Markdown
# 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...)