TLDR;我想使用
@ionic/core
npm 包而不是 initialize()
一次性初始化所有组件,并且对于每个组件 defineCustomElement()
我开始深入研究没有框架的 ionic(普通 Web 组件)和
npm i
@ionic/core
包。它的文档说它有一些“自动延迟加载”模板组件,可以通过包含相应的脚本标签来开箱即用(找到文档here)。这可以正常工作,例如:
<!DOCTYPE html>
<html class="hydrated">
<head>
<meta charset="utf-8" />
<script
type="module"
src="https://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.esm.js"
></script>
<script
nomodule
src="https://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.js"
></script>
<link
href="https://cdn.jsdelivr.net/npm/@ionic/core/css/ionic.bundle.css"
rel="stylesheet"
/>
</head>
<body>
<ion-button>Hello Button</ion-button>
</body>
</html>
也可以从
@ionic/core/components
导入,然后手动初始化,效果很好:
import { initialize } from "@ionic/core/components";
import { defineCustomElement } from "@ionic/core/components/ion-button";
initialize();//initializes ionic and prepares the html
defineCustomElement();//initializes a certain type of element
据说后者特别适用于使用 webpack 等捆绑程序的项目,因为只有那些组件才会包含在所使用的包中。 虽然我理解这是为什么,但我不希望它出现在我的项目中。我希望所有组件都像第一个示例中那样初始化,但我不想使用 CDN,我想使用 npm 包,并且只调用一次像
initialize
这样的函数。由于 CDN 和 npm 包据说是相同的,我以为我可以只关注路径 @ionic/core/dist/ionic/ionic.esm.js
但显然这个文件在我的 node_modules
中不存在。现在我有点卡住了。有人建议我如何才能完成这项工作吗?
我不想使用 CDN,因为我在项目中使用了很多其他库,并通过 npm 管理所有内容,如果知道我有这个需要特殊处理的单一依赖项,我会很烦恼。除此之外,我计划使用电容器为 iOS 和 Android 原生构建,但没有经验,并且不确定 CDN 的使用是否会在应用程序的离线功能方面产生问题。
查看 Stencil 文档以了解它们如何工作以及它们如何分发和初始化。我对 Ionic 的组件不是特别熟悉,但
ionic.esm.js
参考表明它是一个标准的 Stencil 库,通过 ionic.esm.js 管理延迟加载。该文件将根据页面的 DOM 有选择地动态加载与 ionic.esm.js 一起部署的任意数量的其他文件。没有什么可以阻止您自己将该库与应用程序的其余部分一起捆绑/部署 - 您只需要更改 ionic.esm.js 的源路径。但是,如果您想让应用程序加载/初始化组件,您可能需要克隆项目并使用 dist-custom-elements 输出目标重建它,并将它们与任何初始化一起包含在您的应用程序部署中。