Executes the given module to generate source code on build time
npm i -D val-loader
The module that is loaded with this loader must stick to the following interfaces
##
The loaded module must export a function as default
export with the following Function Interface
module.exports = function () {...};
Modules transpiled by Babel are also supported
export default function () {...};
Function Interface
The function will be called with the loader options
and must either return
{Object}
Following the Object Interface
{Promise}
Resolving to an {Object}
following the Object Interface
Object Interface
code
{String|Buffer}
undefined
sourceMap
undefined
ast
{Array<{Object}>}
undefined
dependencies
{Array<{String}>}
[]
contextDependencies
{Array<{String}>}
[]
cacheable
{Boolean}
false
dependencies
have changed
val-loader
itself has no options. The options are passed as they are (without cloning them) to the exported function
If you have a module like this
answer.js
function answer () {
return {
code: 'module.exports = 42;'
}
};
module.exports = answer;
you can use the val-loader to generate source code on build time
webpack.config.js
module.exports = {
...
module: {
rules: [
{
test: require.resolve('path/to/answer.js'),
use: [
{
loader: 'val-loader'
}
]
}
]
}
};
Complete
A complete example of all available features looks like this
answer.js
const ask = require('./ask.js');
const generate = require('./generate.js');
function answer(options) {
return ask(options.question)
.then(generate)
.then(result => ({
ast: result.abstractSyntaxTree,
code: result.code,
// Mark dependencies of answer().
// The function will be re-executed if one of these
// dependencies has changed in watch mode.
dependencies: [
// Array of absolute native paths!
require.resolve('./ask.js'),
require.resolve('./generate.js')
],
// Flag the generated code as cacheable.
// If none of the dependencies have changed,
// the function won't be executed again.
cacheable: true
sourceMap: result.sourceMap,
})
);
}
module.exports = answer;
webpack.config.js
module.exports = {
...
module: {
rules: [
{
test: require.resolve('path/to/answer.js'),
use: [
{
loader: 'val-loader',
options: {
question: 'What is the meaning of life?'
}
}
]
}
]
}
};
Juho Vepsäläinen |
Joshua Wiens |
Kees Kluskens |
Johannes Ewald |