将 vuetify 样式提取到 css 文件

Joh*_*ny5 6 css content-security-policy webpack vuetify.js

我正在做一个概念验证,将 vuetify 包含在已经部分使用 vue 的现有 Web 应用程序中。

我对CSP有一个担忧,默认情况下所有 vuetify 样式都被推送到内联<style>标签中。我不想允许style-src 'unsafe-inline'我的 CSP 进入。

到目前为止,vuetify 在该部分插入了 95 个内联样式标签<head>我确实尝试过按照此处描述的方式放置随机数的选项,但随机数仅添加在最后一个标签上,因此仍然有 94 个。此外,我没有一个可靠的解决方案来生成随机数,所以我不想依赖它。

为每个标签生成哈希值当然是不现实的。

我也看到了这个答案,但我认为它不适用于我的上下文,我不是服务器端渲染。

我正在使用 webpack 4.41.2、vue 2.6.10、vuetify 2.2.8。

以下是配置文件的一些摘录。webpack.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const VuetifyLoaderPlugin = require('vuetify-loader/lib/plugin');

[...]

et entryPoints = Object.assign([...], { vendor: ['vue', 'vue-router', 'axios', 'vue-i18n', 'lodash', 'interactjs'] });

var config = {
   entry: entryPoints,
   output: {
      path: __dirname,
      filename: 'module/[name].js'
   },
   [...]

   plugins: [
      new MiniCssExtractPlugin({ filename: 'module/[name].css', chunkFilename: 'module/[name].css' }),
      new VueLoaderPlugin(),
      new VuetifyLoaderPlugin()
   ],

   optimization: {
      splitChunks: {
         cacheGroups: {
            commons: {
               test: /[\\/]node_modules[\\/]/,
               name: 'vendor',
               chunks: 'all'
            }
         }
      },
      runtimeChunk: { name: 'manifest' }
   }
};

Run Code Online (Sandbox Code Playgroud)

初始化文件

import Vue from 'vue';

import Vuetify from 'vuetify/lib';
import 'vuetify/dist/vuetify.min.css';

[...]

Vue.use(Vuetify);
const vuetifyOptions = new Vuetify();

// Création de l'instance Vue.js, qui sera dessiner dans l'element définit par l'attribut el
window.Vue = new Vue({
   el: '#app',
   render: h => h(App),
   vuetify: vuetifyOptions
});

Run Code Online (Sandbox Code Playgroud)

Joh*_*ny5 5

我终于找到了解决方案,我已经导入了MiniCssExtractPlugin,但将其与less模块一起使用,但我还必须将其添加到sass模块中,由 vuetify 使用。

         {
            test: /\.s(c|a)ss$/,
            use: [
               'vue-style-loader',
               MiniCssExtractPlugin.loader, // <-- that line
               'css-loader',
               {
                  loader: 'sass-loader',
                  // Requires sass-loader@^8.0.0
                  options: {
                     implementation: require('sass'),
                     sassOptions: {
                        fiber: require('fibers'),
                        indentedSyntax: true // optional
                     }
                  }
               }
            ]
         }
Run Code Online (Sandbox Code Playgroud)