生产构建后忽略组件样式

Posted

技术标签:

【中文标题】生产构建后忽略组件样式【英文标题】:Components style ignored after production build 【发布时间】:2020-12-14 08:31:54 【问题描述】:

我有一个配置了 Tailwindcss 和 Postcss 的 Svelte 应用程序。

在开发模式下,一切正常,每种样式(全局样式和组件样式)都已使用并正常工作。

当我进行新的生产构建时,组件样式没有使用,在生产构建期间似乎确实被忽略了。

我为我的组件添加了一些样式,例如 Svelte 文档展示,这在开发本地环境中运行良好。

<style>
  div 
    height: 37px;
  

  div:hover 
    height: 72px;
    border-radius: 1rem;
  
</style>

即使我使用专用样式文件,css 包也完全失败,并且其他一些 css 属性(来自 tailwindcss)也不起作用...

我没有在我的 Rollup/Postcss 配置中找到似乎有问题的地方。

这是我的rollup.config.js

import svelte from 'rollup-plugin-svelte';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import json from '@rollup/plugin-json';
import livereload from 'rollup-plugin-livereload';
import postcss from 'rollup-plugin-postcss';
import  terser  from 'rollup-plugin-terser';
import sveltePreprocess from 'svelte-preprocess';
import svelteSVG from 'rollup-plugin-svelte-svg';

const production = !process.env.ROLLUP_WATCH;

function serve() 
  let started = false;

  return 
    writeBundle() 
      if (!started) 
        started = true;

        // eslint-disable-next-line global-require
        require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], 
          stdio: ['ignore', 'inherit', 'inherit'],
          shell: true,
        );
      
    ,
  ;


export default 
  input: 'src/main.js',
  context: 'window',
  output: 
    sourcemap: true,
    format: 'iife',
    name: 'app',
    file: 'public/build/bundle.js',
  ,
  plugins: [
    postcss(
      extract: true,
    ),
    json(),
    svelteSVG(),
    svelte(
      preprocess: sveltePreprocess( postcss: true ),
      dev: !production,
      emitCss: true,
      css: (css) => 
        css.write('public/build/bundle.css');
      ,
    ),
    resolve(
      browser: true,
      dedupe: ['svelte'],
    ),
    commonjs(),
    !production && serve(),
    !production && livereload('public'),
    production && terser(),
  ],
  watch: 
    clearScreen: false,
  ,
;

这是我的postcss.config.js

const cssnano = require('cssnano');
const postcssColorMod = require('postcss-color-mod-function');
const postcssPresetEnv = require('postcss-preset-env');
const postcssImport = require('postcss-import');
const postcssUrl = require('postcss-url');
const purgecss = require('@fullhuman/postcss-purgecss');
const tailwindcss = require('tailwindcss');
const postcssFontMagician = require('postcss-font-magician');

const production = !process.env.ROLLUP_WATCH;

module.exports = 
  plugins: [
    postcssFontMagician(
      variants: 
        'Roboto Mono': 
          300: [],
          400: [],
          700: [],
        ,
      ,
      foundries: 'google',
      protocol: 'https:',
    ),
    postcssImport(),
    postcssUrl(),
    tailwindcss(),
    postcssPresetEnv(
      stage: 0,
      autoprefixer: 
        grid: false,
      ,
    ),
    postcssColorMod(),
    cssnano(
      autoprefixer: false,
      preset: ['default'],
    ),
    production &&
      purgecss(
        content: ['./**/*.svelte'],
        defaultExtractor: (content) => content.match(/[A-Za-z0-9-_:/]+/g) || [],
      ),
  ],
;

在寻找解决方案和修改配置数小时后,我无法使其正常工作。 我认为 purgecss 功能正在毫无信念地删除我的组件样式。

一切似乎都很好,我错过了什么吗?

编辑

甚至一些 javascript 也没有包含在最终包中。很奇怪

【问题讨论】:

【参考方案1】:

您可以检查几件事: 缓存被清除了吗?public/global.css 是否包含您的样式(或者是 /public/build/bundle.css)?

您可以通过更改index.html 中的“版本”来确保您的浏览器不使用缓存文件,如下所示:

 <link rel="stylesheet" href="/global.css?v=2.4" />
 <link rel="stylesheet" href="/build/bundle.css?v=2.4" />
  <script defer src="/build/bundle.js?v=2.4"></script>  

那些v=2.4 没有任何意义,您只需在每次构建/部署后更改/增加数字,这会迫使浏览器重新加载每个文件。

打开你的global.css 并搜索你的风格标签,你找到了吗?如果是,那么它们被包括在内,这是缓存问题。如果不是,那就是 treeshaking 的问题。

【讨论】:

我没有任何 public/global.css 一切都转到 public/build/bundle.css 并且在生产构建后样式标签不在文件中。我不认为缓存是问题,我在样式表文件上没有任何缓存。在未使用的浏览器上的私人窗口上测试 抱歉 global.css 是我的错误,bundle.css 当然是正确的文件。在我的简单设置中,我有:"build:css": "set \"NODE_ENV=production\" &amp;&amp; tailwindcss build public/tailwind.css -o public/global.css" (package.json)、purge: content: ["./src/**/*.svelte","./shared/**/*.svelte"], (tailwind.config.js) 和 svelte(dev: !production,css: css =&gt; css.write('public/build/bundle.css');), (rollup.config.js)

以上是关于生产构建后忽略组件样式的主要内容,如果未能解决你的问题,请参考以下文章

同一组件中的不同样式,仅在 gatsby 构建版本中

Angular - 样式被忽略/覆盖

聚合物组件Shady DOM样式只是对生产的评论

除非刷新页面,否则React loadable无法在每个新构建上加载组件

laravel脚手架搭建项目问题之生产环境element-ui组件字体图标显示错误问题

我如何将 CSS 应用于 VAADIN 8 中的组件