Styling not applied to vue web component during development

前端 未结 1 2029
天涯浪人
天涯浪人 2021-02-01 05:44

While developing a Vue web component, the style is not applied to the web component, but added to the head of the document. This means that the style i

相关标签:
1条回答
  • 2021-02-01 06:06

    Based on the GitHub issue you linked, the solution is to set the shadowMode option in vue-loader and vue-style-loader. shadowMode is false by default in a Vue CLI project, but we can tweak that in vue.config.js.

    First, we'd inspect the Webpack config to determine which loaders to change:

    # run at project root
    vue inspect
    

    The command output reveals several loader configs with shadowMode: 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  // <---
              }
            },
            /* ... */
          ]
        },
        /* ... */
    

    full list of Webpack loader configs with shadowMode: false:

    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')
    

    So, we can set shadowMode: true for those configs in vue.config.js with this snippet:

    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);
      }
    }
    

    Creating <projectroot>/vue.config.js with the snippet above enables Shadow CSS in development mode in your project. See https://github.com/snirp/vue-web-component/pull/1.

    0 讨论(0)
提交回复
热议问题