Stencil components and Vue
Recently I build some components with Stencil for an Angular project. Unsurprisingly the created components also work well with Vue. There are two steps necessary. Here is the workflow:
First Step: Create your Stencil component
At first create a directory and install Stencils dependencies.
mkdir stencil-components
cd stencil-components
npm init -y
npm install @stencil/core -S
npm install @stencil/utils -D
Now create your component in Stencil. That is well documented here.
Name it my-first-component.tsx
import {Component, Prop} from '@stencil/core';
@Component({
tag: 'my-first-component',
styleUrl: 'my-first-component.scss'
})
export class MyFirstComponent {
// Indicate that name should be a public property on the component
@Prop() name: string;
render() {
return (
<p>
My name is {this.name}
</p>
);
}
}
Setup the build system for stencil with a file called stencil.config.js:
exports.config = {
namespace: 'stencil-components',
generateDistribution: true,
generateWWW: false,
bundles: [{components: ['my-first-component']}]
};
And a package.json:
{
"name": "@vweber/stencil-components",
"version": "1.0.0",
"description": "",
"main": "dist/stencil-components.js",
"browser": "dist/stencil-components.js",
"types": "dist/types/components.d.ts",
"collection": "dist/collection/collection-manifest.json",
"files": [
"dist/"
],
"scripts": {
"build": "stencil build",
"start": "serve .",
"prepublish": "npm run build"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@stencil/core": "^0.4.2"
},
"devDependencies": {
"@stencil/utils": "0.0.4",
"serve": "^6.4.9"
}
}
Update
As JoshuaTS stated, you have a little helper in your toolbox doing a lot of the above work for you:
npm init stencil
Now you are able to publish that component:
npm publish --access=public
Second step: Include the component in vue
Before you are able to consume your component in Vue you have to include the dependencies in your package.json. Don’t
forget to import the component in the main.js of your app.
Now it’s easy to use your Stencil component in the template:
<my-first-component v-bind:name="Alwin"/>
Happy coding!