我想将我在 vue 项目中使用的一些组件导出为 web 组件,以便能够在其他非 vue 项目中使用它们。 我看到 vue 支持这一点,并且它导出 web 组件,但我遇到的问题是 css - 使用导出的 web 组件时不包含(或不可用)。
为了使此案例易于重现,我使用创建新的 vue js 3 项目时生成的默认代码。我想要导出为 Web 组件的组件是我们在新项目中获得的默认 App.vue。
重现步骤:
import { createApp, defineCustomElement } from 'vue'
import App from './App.vue'
createApp(App).mount('#app'). // this can be commented out
const customApp = defineCustomElement(App);
window.customElements.define('app-component', customApp);
"build:wc": "vue-cli-service build --target lib --name AppComponent src/main.ts"
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
css: {
extract: false,
}
})
.hello { border: 1px solid green; background-color: #dedede; }
这将创建一个新文件夹 - dist - 并在其中放置导出的 Web 组件 - AppComponent.udm.js 是我们需要导入的文件,以便访问新导出的组件。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Web-Component</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="../dist/AppComponent.umd.js"></script>
</head>
<body>
<app-component></app-component>
</body>
</html>
当我在 chrome 中打开此文件时,我可以在 test.html 中看到 web 组件,我可以看到该组件,但它没有应用 css。
我打开生成的 AppComponent.umd.js 文件,我看到 css 已添加到其中(您可以看到 .hello 类及其定义:border:1px Solid green;background-color:#dedede):
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, "h3[data-v-1ac357d5]{margin:40px 0 0}ul[data-v-1ac357d5]{list-style-type:none;padding:0}li[data-v-1ac357d5]{display:inline-block;margin:0 10px}a[data-v-1ac357d5]{color:#42b983}.hello[data-v-1ac357d5]{border:1px solid green;background-color:#dedede}", ""]);
但是...... test.html 文件无法正确渲染(如下面的屏幕截图所示)。
问题:
正确的做法是怎样的?如何从 vue 3 导出一个 web 组件(带有子组件 - 就像我在本例中使用 HelloWordComponent 的 App.vue 一样),以便浏览器正确渲染它(使用 css)。
有人遇到过这个问题吗?一些想法?一些文档/教程?
我尝试将 VUE 组件导出为 Web 组件。我希望得到一个完整的功能组件 - 但我得到它没有风格。
如果您将 SFC 从
my-component.vue
重命名为 my-component.ce.vue
,则样式将由 defineCustomElement
正确处理,请参阅 https://vuejs.org/guide/extras/web-components 了解详细信息(Example.vue 是重命名为Example.ce.vue)