UNPKG

vlang-loader

Version:

Webpack loader for the V programming language; supports JS and WASM builds

81 lines (56 loc) 2.69 kB
# 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...)