htl-loader
Version:
Webpack loader for HTL/Sightly templates
127 lines (101 loc) • 3.79 kB
Markdown
# htl-loader
Webpack loader for HTL/Sightly templates. Based on [`@adobe/htlengine`](https://www.npmjs.com/package/@adobe/htlengine).
## Installation
`npm install --save htl-loader @adobe/htlengine`
## Usage
See [./example](./example).
1. Add loader to `webpack.config.js`:
```js
{
module: {
rules: [
{
test: /\.htl$/,
use: ["htl-loader"]
}
];
}
}
```
2. Create exemplary `template.htl`:
```html
<h1 data-sly-use.page="./data">${page.title}</h1>
```
3. Create exemplary `data.js` in same directory:
```js
module.exports = class Data {
use() {
return {
title: "Hello"
};
}
};
```
4. Import and run compiled template in your JavaScript:
```js
import html from "./template.htl";
// <h1>Hello</h1>
document.body.insertAdjacentHTML("beforeend", html);
```
## Advanced
### Configuration options
| Name | Default | Description |
| :-------------------------------------------------------- | :------ | :-------------------------------------------------------- |
| [`globalName`](./test/build.test.js#L77-L86) | `htl` | Name of the runtime global variable. |
| `transformSource` | `null` | Function invoked before compiling the htl. |
| `transformCompiled` | `null` | Function invoked after compiling the htl. |
| [`data`](./test/build.test.js#L61-L69) | `{}` | Runtime global. |
| [`includeRuntime`](./test/build.test.js#L96-L107) | `true` | Include runtime and evaluate template during compilation. |
| [`runtimeVars`](./test/build.test.js#L109-L124) | `[]` | Add (global) runtime variable names during compilation. |
| [`moduleImportGenerator`](./test/build.test.js#L126-L145) | `null` | Use custom module import generator. |
| [`scriptResolver`](./test/build.test.js#L81-L98) | `null` | Use custom script resolver. |
| [`templateLoader`](./test/build.test.js#L100-L119) | `null` | Use custom template loader. |
### Example
```js
{
module: {
rules: [
{
test: /\.htl$/,
use: [
{
loader: "htl-loader",
options: {
// Remove directives `@adobe/htlengine` does not understand
transformSource: source => {
const output = source
.replace(/data-sly-use\.templates?="(.*?)"/g, "")
.replace(
/<sly[^>]+data-sly-call=(["']).*?\1.*?><\/sly>/g,
""
);
return output;
},
// Allow for custom models in data from `use` directives
transformCompiled: (compiled, settings) => {
const output = compiled.replace(
/(new Runtime\(\);)/,
`$1
const originalUse = runtime.use.bind(runtime);
runtime.use = function(uri, options) {
const settings = Object.assign({
model: '${settings.model}'
}, options);
return originalUse(uri, settings);
}`
);
return output;
},
useDir: path.resolve(__dirname, "../src/htlmocks")
}
}
]
}
];
}
}
```
## Contributors
- [tripodsan](https://github.com/tripodsan)
## License
[MIT](http://www.opensource.org/licenses/mit-license)