现有的延迟加载示例包含同一应用程序的所有延迟加载组件,因此它是作为一个整体构建的,只是打包成块。
该应用程序位于/ app /下,而模块位于/ mod /...
下我可以这样做来对路线做出反应:
import('/mod/admindashboard/kw-admindashboard.js').then((module) => {
// Put code in here that you want to run every time when
// navigating to view1 after my-view1.js is loaded.
console.log("Loaded admindashboard");
});
然后我可以使用相应的Web组件,但是要使其正常工作,我需要像这样修改该组件:
import { PolymerElement, html } from '/app/node_modules/@polymer/polymer/polymer-element.js';
import '/app/node_modules/@polymer/iron-icon/iron-icon.js';
import '/app/node_modules/@polymer/iron-icons/iron-icons.js';
class KwAdmindashboard extends PolymerElement {
static get template() {
...
但是这种方法使我无法完全运行测试,创建静态内部版本,并且IDE支持在很多地方都不可用,因为它无法在以后的运行时看到可用的东西。因此,作为绝对后备,这将是可能的。没有办法利用serviceWorkers来处理映射吗?
答案 0 :(得分:1)
以下是我想您的要求的一个很好的例子。模块将加载页面属性。由于页面属性依赖于Iron-page,selected='{{page}}'
依赖于Iron-Page的name属性更改了页面值时,其观察者将加载该页面的模块。 :
static get properties() { return {
page: {
type: String,
reflectToAttribute: true,
observer: '_pageChanged'
},
.......
_pageChanged(page, oldPage) {
if (page != null) {
let cb = this._pageLoaded.bind(this, Boolean(oldPage));
// HERE BELOW YOUR PAGE NAMES
switch (page) {
case 'list':
import('./shop-list.js').then(cb);
break;
case 'detail':
import('./shop-detail.js').then(cb);
break;
case 'cart':
import('./shop-cart.js').then(cb);
break;
case 'checkout':
import('./shop-checkout.js').then(cb);
break;
default:
this._pageLoaded(Boolean(oldPage));
}
在cb
上方是一个函数,该函数正在加载惰性模块,但需要在第一次渲染后立即加载。这是最低要求的文件。
_pageLoaded(shouldResetLayout) {
this._ensureLazyLoaded();
}
这是上面的完整代码链接。希望这对您有帮助,如果有任何问题,我将尝试答复。 https://github.com/Polymer/shop/blob/master/src/shop-app.js
答案 1 :(得分:0)
似乎Polymer 3尚未准备好用于Web组件的分布式位置。
W3C上存在github问题,可以解决以下问题:
现在,我将切换我的开发模型,以便微服务在nexus的npm repo中提供一个或多个web组件,并且管理应用程序具有对它们的构建时间依赖性,并可以一次构建整个应用程序,在那里我可以使用商店演示还推广/显示的延迟加载方法。
要获得来自多个来源的Web组件的良好开发体验,请查看"npm link"。
一旦技术和标准赶上,就可以随意添加其他解决方案或真正的解决方案。