Polymer 不是函数:部署 Meteor/Blaze/Polymer 2 应用程序时遇到问题
Polymer is not a function : troubles deploying a Meteor / Blaze / Polymer 2 application
我花了最后 5-6 天的时间将一个相对较大的遗留 Polymer 0.5 应用程序迁移到 Polymer 2,这不是小菜一碟。
本地一切顺利。当使用新版本在线部署时,我得到了一个新的惊喜,应用程序的 UI 被破坏并且控制台充满了这种类型的消息:
Uncaught TypeError: Polymer is not a function
at iron-meta.html:125
at iron-meta.html:215
iron-icon.html:146 Uncaught TypeError: Cannot read property 'create' of undefined
at iron-icon.html:146
iron-iconset-svg.html:50 Uncaught TypeError: Polymer is not a function
at iron-iconset-svg.html:50
iron-pages.html:56 Uncaught TypeError: Polymer is not a function
at iron-pages.html:56
iron-image.html:145 Uncaught TypeError: Polymer is not a function
at iron-image.html:145
paper-card.html:167 Uncaught TypeError: Polymer is not a function
at paper-card.html:167
paper-toolbar.html:292 Uncaught TypeError: Polymer is not a function
at paper-toolbar.html:292
paper-ripple.html:440 Uncaught TypeError: Polymer is not a function
at paper-ripple.html:440
at paper-ripple.html:764
paper-button.html:170 Uncaught TypeError: Polymer is not a function
at paper-button.html:170
paper-checkbox.html:239 Uncaught TypeError: Polymer is not a function
at paper-checkbox.html:239
iron-overlay-backdrop.html:62 Uncaught TypeError: Polymer is not a function
at iron-overlay-backdrop.html:62
at iron-overlay-backdrop.html:166
iron-overlay-manager.html:48 Uncaught TypeError: Cannot read property 'add' of undefined
at new Polymer.IronOverlayManagerClass (iron-overlay-manager.html:48)
at iron-overlay-manager.html:382
这样的例子不胜枚举。 "Polymer is not a function" 类型的错误发生在这种类型的代码上:
<script>
(function() {
'use strict';
Polymer({ <=======
is: 'paper-toast',
我首先无法理解的是开发环境和生产环境之间的差异从何而来。
在“网络”选项卡中,我可以看到所有供应商 Web 组件都以相同的顺序加载,并且没有请求失败。它只是在产品中不起作用,这使得调试变得复杂。
这是一个 Meteor 应用程序,带有 Blaze 和 Polymer(我知道那是一种糟糕的鸡尾酒)。
代码大致如下:
imports.html
(简体)
<head>
<script>
window.Polymer = {
lazyRegister: true
};
</script>
<!-- Webcomponents Polyfill -->
<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<!-- Polymer elements -->
<link rel="import" href="/bower_components/polymer/polymer.html">
<link rel="import" href="/bower_components/app-layout/app-layout.html">
<link rel="import" href="/bower_components/iron-collapse/iron-collapse.html">
<!-- etc -->
</head>
app.html
(应用程序根视图,简化)
<template name="applicationLayout">
<app-drawer-layout>
<!-- Left title and menu -->
<app-drawer slot="drawer">
<app-toolbar></app-toolbar>
{{>menu}}
</app-drawer>
<!-- Main content, page, router yielder -->
<app-header-layout>
<app-header slot="header">
<app-toolbar>
<div>{{>topBarMenus}}</div>
</app-toolbar>
</app-header>
<div>{{>yield}}</div>
</app-header-layout>
</app-drawer-layout>
</template>
<template>
小胡子标签是 Blaze 的东西。
您可以注意到我没有 <body>
、<html>
或其他包含(对于 Meteor 等),这实际上是我的应用程序的唯一引导代码。我对此无能为力。 Meteor 检测到 <head>
并注入它,但自己创建其余部分,插入其样式表等。我自己无法创建它。我知道这很愚蠢。我也不喜欢 Meteor 和 Blaze。
我知道 Polymer 建议将应用程序根目录放在 <dom-module>
中,在另一个 HTML 文件中,加载 HTML 导入等,但我什至不能这样做(感谢 Meteor),我也无法重写整个应用程序(尽管我愿意)。
有解决办法吗?我的意思是,它正在开发中。什么会导致这个?它发生在所有浏览器中。
看来那天我很累,两天后回来解决这个问题,我在大约 20 分钟内找到并解决了问题。
就我而言,我的 bower.json 中缺少一个 webcomponent bower 包。它安装在我的机器上,但忘记将它 (bower i -S
) 保存到清单中。在生产中,因此没有安装它。
在我的特殊情况下,当找不到请求的文件时,我的 Meteor 设置会发送 200 个状态代码和索引文件。这消除了我通常会因丢失包裹而出现的错误。但它以非显式方式使 Polymer 初始化崩溃。
寓意是:
仔细检查你的包!! 版本、对等依赖、缺失等
如果可能,使用其他包管理器而不是 Bower(可惜 Polymer 仍然依赖于它)或 npm,它们非常糟糕,并且 just use yarn.
我花了最后 5-6 天的时间将一个相对较大的遗留 Polymer 0.5 应用程序迁移到 Polymer 2,这不是小菜一碟。
本地一切顺利。当使用新版本在线部署时,我得到了一个新的惊喜,应用程序的 UI 被破坏并且控制台充满了这种类型的消息:
Uncaught TypeError: Polymer is not a function
at iron-meta.html:125
at iron-meta.html:215
iron-icon.html:146 Uncaught TypeError: Cannot read property 'create' of undefined
at iron-icon.html:146
iron-iconset-svg.html:50 Uncaught TypeError: Polymer is not a function
at iron-iconset-svg.html:50
iron-pages.html:56 Uncaught TypeError: Polymer is not a function
at iron-pages.html:56
iron-image.html:145 Uncaught TypeError: Polymer is not a function
at iron-image.html:145
paper-card.html:167 Uncaught TypeError: Polymer is not a function
at paper-card.html:167
paper-toolbar.html:292 Uncaught TypeError: Polymer is not a function
at paper-toolbar.html:292
paper-ripple.html:440 Uncaught TypeError: Polymer is not a function
at paper-ripple.html:440
at paper-ripple.html:764
paper-button.html:170 Uncaught TypeError: Polymer is not a function
at paper-button.html:170
paper-checkbox.html:239 Uncaught TypeError: Polymer is not a function
at paper-checkbox.html:239
iron-overlay-backdrop.html:62 Uncaught TypeError: Polymer is not a function
at iron-overlay-backdrop.html:62
at iron-overlay-backdrop.html:166
iron-overlay-manager.html:48 Uncaught TypeError: Cannot read property 'add' of undefined
at new Polymer.IronOverlayManagerClass (iron-overlay-manager.html:48)
at iron-overlay-manager.html:382
这样的例子不胜枚举。 "Polymer is not a function" 类型的错误发生在这种类型的代码上:
<script>
(function() {
'use strict';
Polymer({ <=======
is: 'paper-toast',
我首先无法理解的是开发环境和生产环境之间的差异从何而来。 在“网络”选项卡中,我可以看到所有供应商 Web 组件都以相同的顺序加载,并且没有请求失败。它只是在产品中不起作用,这使得调试变得复杂。
这是一个 Meteor 应用程序,带有 Blaze 和 Polymer(我知道那是一种糟糕的鸡尾酒)。
代码大致如下:
imports.html
(简体)
<head>
<script>
window.Polymer = {
lazyRegister: true
};
</script>
<!-- Webcomponents Polyfill -->
<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<!-- Polymer elements -->
<link rel="import" href="/bower_components/polymer/polymer.html">
<link rel="import" href="/bower_components/app-layout/app-layout.html">
<link rel="import" href="/bower_components/iron-collapse/iron-collapse.html">
<!-- etc -->
</head>
app.html
(应用程序根视图,简化)
<template name="applicationLayout">
<app-drawer-layout>
<!-- Left title and menu -->
<app-drawer slot="drawer">
<app-toolbar></app-toolbar>
{{>menu}}
</app-drawer>
<!-- Main content, page, router yielder -->
<app-header-layout>
<app-header slot="header">
<app-toolbar>
<div>{{>topBarMenus}}</div>
</app-toolbar>
</app-header>
<div>{{>yield}}</div>
</app-header-layout>
</app-drawer-layout>
</template>
<template>
小胡子标签是 Blaze 的东西。
您可以注意到我没有 <body>
、<html>
或其他包含(对于 Meteor 等),这实际上是我的应用程序的唯一引导代码。我对此无能为力。 Meteor 检测到 <head>
并注入它,但自己创建其余部分,插入其样式表等。我自己无法创建它。我知道这很愚蠢。我也不喜欢 Meteor 和 Blaze。
我知道 Polymer 建议将应用程序根目录放在 <dom-module>
中,在另一个 HTML 文件中,加载 HTML 导入等,但我什至不能这样做(感谢 Meteor),我也无法重写整个应用程序(尽管我愿意)。
有解决办法吗?我的意思是,它正在开发中。什么会导致这个?它发生在所有浏览器中。
看来那天我很累,两天后回来解决这个问题,我在大约 20 分钟内找到并解决了问题。
就我而言,我的 bower.json 中缺少一个 webcomponent bower 包。它安装在我的机器上,但忘记将它 (bower i -S
) 保存到清单中。在生产中,因此没有安装它。
在我的特殊情况下,当找不到请求的文件时,我的 Meteor 设置会发送 200 个状态代码和索引文件。这消除了我通常会因丢失包裹而出现的错误。但它以非显式方式使 Polymer 初始化崩溃。
寓意是:
仔细检查你的包!! 版本、对等依赖、缺失等
如果可能,使用其他包管理器而不是 Bower(可惜 Polymer 仍然依赖于它)或 npm,它们非常糟糕,并且 just use yarn.