css - 样式在开发期间未应用于 vue web 组件

标签 css vue.js vuejs2 web-component

在开发Vue web组件时,style并不是应用到web组件,而是添加到文档的head。这意味着样式在影子 DOM 中被忽略。以下是我在 main.js 中包装 Web 组件的方式:

import Vue from 'vue';
import wrap from '@vue/web-component-wrapper';
import MyWebComponent from './components/MyWebComponent';

const WrappedElement = wrap(Vue, MyWebComponent);

window.customElements.define('my-web-component', WrappedElement);

同样,样式标签内的任何 CSS 规则都不会生效。

当我为生产构建时,样式添加到网络组件中。我使用以下命令进行包装:

vue-cli-service build  --target wc --name my-web-component ./src/components/MyWebComponent.vue

有没有办法用 vue-cli-service serve 实现同样的事情?

编辑:这里的示例 repo :https://github.com/snirp/vue-web-component

edit2:我觉得我的问题与 this issue 密切相关.我不太了解变通办法,我更看重更基本的解决方案。

最佳答案

根据您链接的 GitHub 问题,solution是设置 shadowMode option in vue-loader vue-style-loader . shadowModefalse默认情况下在 Vue CLI 元素中,但我们可以在 vue.config.js 中对其进行调整.

首先,我们会 inspect the Webpack config确定要更改的加载程序:

# run at project root
vue inspect

command outputshadowMode: false 揭示了几个加载器配置:

/* config.module.rule('css') */
{
  test: /\.css$/,
  oneOf: [
    /* config.module.rule('css').oneOf('vue-modules') */
    {
      resourceQuery: /module/,
      use: [
        /* config.module.rule('css').oneOf('vue-modules').use('vue-style-loader') */
        {
          loader: 'vue-style-loader',
          options: {
            sourceMap: false,
            shadowMode: false  // <---
          }
        },
        /* ... */
      ]
    },
    /* ... */

带有 shadowMode: false 的 Webpack 加载器配置的完整列表:

config.module.rule('vue').use('vue-loader')
config.module.rule('css').oneOf('vue-modules').use('vue-style-loader')
config.module.rule('css').oneOf('vue').use('vue-style-loader')
config.module.rule('css').oneOf('normal-modules').use('vue-style-loader')
config.module.rule('css').oneOf('normal').use('vue-style-loader')
config.module.rule('postcss').oneOf('vue-modules').use('vue-style-loader')
config.module.rule('postcss').oneOf('vue').use('vue-style-loader')
config.module.rule('postcss').oneOf('normal-modules').use('vue-style-loader')
config.module.rule('postcss').oneOf('normal').use('vue-style-loader')
config.module.rule('scss').oneOf('vue-modules').use('vue-style-loader')
config.module.rule('scss').oneOf('vue').use('vue-style-loader')
config.module.rule('scss').oneOf('normal-modules').use('vue-style-loader')
config.module.rule('scss').oneOf('normal').use('vue-style-loader')
config.module.rule('sass').oneOf('vue-modules').use('vue-style-loader')
config.module.rule('sass').oneOf('vue').use('vue-style-loader')
config.module.rule('sass').oneOf('normal-modules').use('vue-style-loader')
config.module.rule('sass').oneOf('normal').use('vue-style-loader')
config.module.rule('less').oneOf('vue-modules').use('vue-style-loader')
config.module.rule('less').oneOf('vue').use('vue-style-loader')
config.module.rule('less').oneOf('normal-modules').use('vue-style-loader')
config.module.rule('less').oneOf('normal').use('vue-style-loader')
config.module.rule('stylus').oneOf('vue-modules').use('vue-style-loader')
config.module.rule('stylus').oneOf('vue').use('vue-style-loader')
config.module.rule('stylus').oneOf('normal-modules').use('vue-style-loader')
config.module.rule('stylus').oneOf('normal').use('vue-style-loader')

所以,我们可以设置shadowMode: true对于 vue.config.js 中的那些配置使用此代码段:

function enableShadowCss(config) {
  const configs = [
    config.module.rule('vue').use('vue-loader'),
    config.module.rule('css').oneOf('vue-modules').use('vue-style-loader'),
    config.module.rule('css').oneOf('vue').use('vue-style-loader'),
    config.module.rule('css').oneOf('normal-modules').use('vue-style-loader'),
    config.module.rule('css').oneOf('normal').use('vue-style-loader'),
    config.module.rule('postcss').oneOf('vue-modules').use('vue-style-loader'),
    config.module.rule('postcss').oneOf('vue').use('vue-style-loader'),
    config.module.rule('postcss').oneOf('normal-modules').use('vue-style-loader'),
    config.module.rule('postcss').oneOf('normal').use('vue-style-loader'),
    config.module.rule('scss').oneOf('vue-modules').use('vue-style-loader'),
    config.module.rule('scss').oneOf('vue').use('vue-style-loader'),
    config.module.rule('scss').oneOf('normal-modules').use('vue-style-loader'),
    config.module.rule('scss').oneOf('normal').use('vue-style-loader'),
    config.module.rule('sass').oneOf('vue-modules').use('vue-style-loader'),
    config.module.rule('sass').oneOf('vue').use('vue-style-loader'),
    config.module.rule('sass').oneOf('normal-modules').use('vue-style-loader'),
    config.module.rule('sass').oneOf('normal').use('vue-style-loader'),
    config.module.rule('less').oneOf('vue-modules').use('vue-style-loader'),
    config.module.rule('less').oneOf('vue').use('vue-style-loader'),
    config.module.rule('less').oneOf('normal-modules').use('vue-style-loader'),
    config.module.rule('less').oneOf('normal').use('vue-style-loader'),
    config.module.rule('stylus').oneOf('vue-modules').use('vue-style-loader'),
    config.module.rule('stylus').oneOf('vue').use('vue-style-loader'),
    config.module.rule('stylus').oneOf('normal-modules').use('vue-style-loader'),
    config.module.rule('stylus').oneOf('normal').use('vue-style-loader'),
  ];
  configs.forEach(c => c.tap(options => {
    options.shadowMode = true;
    return options;
  }));
}

module.exports = {
  // https://cli.vuejs.org/guide/webpack.html#chaining-advanced
  chainWebpack: config => {
    enableShadowCss(config);
  }
}

正在创建 <projectroot>/vue.config.js使用上面的代码片段可以在元素的开发模式下启用 Shadow CSS。参见 https://github.com/snirp/vue-web-component/pull/1 .

关于css - 样式在开发期间未应用于 vue web 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53431754/

相关文章:

javascript - native 延迟加载图像回流(加载 ='"延迟”)

javascript - 带有可折叠子项的 html 复选框选择列表

javascript - 如何在传单弹出窗口中集成 Vue 组件?

javascript - [Vue 警告] : Invalid prop: type check failed for prop "X". 预期,得到字符串

vue.js - Vue Chart JS 和选项 react 性

html - 将一个 div 居中,宽度与其内容一样

javascript - Bootstrap + 词缀 : affixed menu jumps off screen

javascript - 如何使用 VueJS 防止数字输入

javascript - 如何修复带有复选框的 vue 更新?

html - 分区 :hover changes attributes of another DIV