将 vuetify 样式提取到 css 文件
Extract vuetify styles to css file
我正在进行概念验证,以将 vuetify 包含在已经部分使用 vue 的现有 Web 应用程序中。
我担心 CSP,默认情况下,所有 vuetify 样式都被推送到内联 <style>
标签中。我不想在我的 CSP 中允许 style-src 'unsafe-inline'
。
到目前为止,vuetify 在 <head>
部分插入了 95 个内联样式标签。我确实尝试过像 here 中描述的那样放置随机数的选项,但是随机数只添加到最后一个标签上,所以还有 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' }
}
};
初始化文件
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
});
我终于找到了解决方案,我已经在导入 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
}
}
}
]
}
我正在进行概念验证,以将 vuetify 包含在已经部分使用 vue 的现有 Web 应用程序中。
我担心 CSP,默认情况下,所有 vuetify 样式都被推送到内联 <style>
标签中。我不想在我的 CSP 中允许 style-src 'unsafe-inline'
。
到目前为止,vuetify 在 <head>
部分插入了 95 个内联样式标签。我确实尝试过像 here 中描述的那样放置随机数的选项,但是随机数只添加到最后一个标签上,所以还有 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' }
}
};
初始化文件
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
});
我终于找到了解决方案,我已经在导入 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
}
}
}
]
}