如何在Polymer 3.0应用中使用未迁移的Polymer 2.0组件?
在Polymer 3.0应用中使用Polymer 2.0组件的解决方案
没问题,我来给你梳理一下如何在Polymer 3.0项目中兼容使用未迁移的Polymer 2.0组件(比如vaadin-grid这类),我之前帮同事处理过类似的迁移场景,下面是亲测可行的几种方案:
方案一:将2.x组件转换为ES模块(推荐)
Polymer官方提供了工具可以把基于HTML Imports的2.x组件打包成ES模块,这样就能和3.x的组件无缝集成:
- 首先安装转换工具:
npm install --save-dev @polymer/legacy-element-build - 针对目标2.x组件(比如
vaadin-grid),运行转换命令生成ES模块文件:polymer build-legacy-element bower_components/vaadin-grid/vaadin-grid.html --out vaadin-grid.js - 之后在你的3.x组件中,就可以像导入普通ES模块一样使用它:
import './vaadin-grid.js'; class MyApp extends PolymerElement { static get template() { return html` <vaadin-grid items="[[data]]"> <!-- 配置列 --> </vaadin-grid> `; } } customElements.define('my-app', MyApp);
方案二:直接在HTML中引入HTML Imports(快速兼容)
如果不想逐个转换组件,也可以通过加载兼容层来直接使用HTML Imports形式的2.x组件:
- 在项目的主HTML文件中,先加载必要的兼容依赖:
<!-- 加载Web Components polyfill --> <script src="node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script> <!-- 加载Polymer 2.x兼容层,支持HTML Imports和全局Polymer对象 --> <script type="module" src="node_modules/@polymer/polymer/lib/legacy/html-import-element.js"></script> <script type="module" src="node_modules/@polymer/polymer/lib/legacy/polymer-fn.js"></script> - 接着用HTML Imports引入2.x组件:
<link rel="import" href="bower_components/vaadin-grid/vaadin-grid.html"> - 之后在你的3.x ES模块组件中,就可以直接使用
<vaadin-grid>标签了,因为该元素已经被注册到全局自定义元素注册表中。
方案三:配置Polymer CLI混合构建
如果你的项目使用Polymer CLI进行构建,可以修改polymer.json来同时兼容ES模块和HTML Imports:
- 在
polymer.json的sources数组中,同时包含3.x的JS组件和2.x的HTML组件路径:{ "sources": [ "src/**/*.js", "bower_components/vaadin-grid/**/*.html" ] } - 运行
polymer build时,构建工具会自动处理两种模块系统的依赖,生成兼容的生产包。
注意事项
- 确保使用最新版本的
@webcomponents/webcomponentsjs,它能更好地兼容现代浏览器和Web Components标准 - 部分2.x组件可能依赖全局的
Polymer对象,务必确保@polymer/polymer/lib/legacy/polymer-fn.js被正确加载 - 测试时注意样式兼容性,3.x的Shadow DOM样式封装和2.x略有差异,可能需要微调组件的CSS变量
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

