将webcomponents捆绑成一个npm包,以便可以有选择地导入webcomponents

时间:2018-08-27 13:24:35

标签: javascript npm webpack web-component

在我当前的项目中,我们正在根据v1规范构建本机Web组件,我们目前正在将 webpack 打包在单个捆绑包comp-webcomponents.js中。

这是当前捆绑软件的入口文件:

import 'document-register-element';
import 'nodelist-foreach-polyfill';
import 'babel-polyfill';

import 'components/tabs/comp-tabs';
import 'components/workspace-switcher/workspace-switcher';
import 'components/table/comp-table';
import 'components/date/comp-date';
import 'components/datepicker/comp-datepicker';
import 'components/datetime/comp-datetime';
import 'components/decimal/comp-decimal';
import 'components/number/comp-number';
import 'components/editor/comp-editor';
import 'components/time/comp-time';
import 'components/input/comp-input';
import 'components/button/comp-button';
import 'components/toggle-button/comp-toggle-button';
import 'components/yearmonth/comp-yearmonth';

一些组件具有供应商依赖性,例如jQuery,datatables.net,jquery-ui,lodash等。

问题1:需要采取哪些步骤,以便其他项目可以有选择地导入单个Web组件?

类似

import { compTable, compYearmonth } from "@comp-webcomponents";

问题2:要使每个Web组件成为可使用单个名称空间安装的npm软件包,需要什么?

类似

npm install --save @comp-webcomponents/comp-div

示例组件:

class CompDiv extends HTMLDivElement {
  constructor(...args) {
    const self = super(...args);
    self.property = null;
    return self;
  }
  connectedCallback() {
    console.log('connected CompDiv');
  }
}

customElements.define('comp-div', CompDiv, { extends: 'div' });

高度赞赏链接或其他有用的资源!

1 个答案:

答案 0 :(得分:2)

我在Web组件项目中使用Typescript。我在src文件夹中放置了所有单独的组件,并在其中创建了index.ts文件,并分别导出每个组件。

export {compDiv, compTable, comeYearmonth} from './compDiv';
export {example} from './example';

您可以阅读有关内容,并按照此tutorial中的说明进行尝试。使用tsc构建并且类型声明在dist文件夹中之后,我publish to NPM。发布后,我可以这样导入:

import { compTable, compYearmonth } from "@comp-webcomponents";

您还可以查看Stencil,这是一个可生成可重复使用的Web组件的编译器。

这是我的Web组件的外观:

export class ExampleComponent extends HTMLElement {

  constructor() {
    super();

    const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.appendChild(ExampleComponent.template.content.cloneNode(true));        
    }

    connectedCallback() {
      console.log('hello');
    }
}

    ExampleComponent.tag = 'example-component';
    ExampleComponent.template = document.createElement('template');
    ExampleComponent.template.innerHTML = `
    <template>
      <p>hello</p>
    </template>
    `;
    customElements.define(ExampleComponent.tag, ExampleComponent);