You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron Forge导入.pcss文件遇DataUrl生成失败错误如何解决?

解决Electron Forge中.pcss文件导入的DataUrl生成错误

错误信息

Electron Forge was terminated:
CodeGenerationError: DataUrl can't be generated automatically, because there is no mimetype for ".pcss" in mimetype database. Either pass a mimetype via "generator.mimetype" or use type: "asset/resource" to create a resource file instead of a DataUrl

场景复现

导入.pcss的React组件代码:

import React from 'react';
import './style.pcss';

type ContainerProps = {
  children: any;
}

export const Container: React.FC<ContainerProps> = ({ children }) => <div className="app-container">{children}</div>;

对应的style.pcss内容:

.app-container {
    @apply flex w-full h-full min-h-screen bg-gray-800 divide-x divide-gray-900 divide-opacity-50;
}

项目配置文件

webpack.renderer.config.js

const rules = require('./webpack.rules');
const plugins = require('./webpack.plugins');

rules.push({
  test: /\.css$/,
  use: [{ loader: 'style-loader' }, { loader: 'css-loader' }],
});

module.exports = {
  module: {
    rules,
  },
  plugins: plugins,
  resolve: {
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.pcss'],
    fallback: {
      fs: false,
      'stream': require.resolve('stream-browserify'),
      'buffer': require.resolve('buffer'),
      'util': require.resolve('util'),
      'assert': require.resolve('assert'),
      'http': require.resolve('stream-http'),
      'url': require.resolve('url'),
      'https': require.resolve('https-browserify'),
      'os': require.resolve('os-browserify'),
      'path': require.resolve('path-browserify')
    },
  },
};

webpack.rules.js

module.exports = [
  // Add support for native node modules
  {
    // We're specifying native_modules in the test because the asset relocator loader generates a
    // "fake" .node file which is really a cjs file.
    test: /native_modules\/.+\.node$/,
    use: 'node-loader',
  },
  {
    test: /\.(m?js|node)$/,
    parser: { amd: false },
    use: {
      loader: '@vercel/webpack-asset-relocator-loader',
      options: {
        outputAssetBase: 'native_modules',
      },
    },
  },
  {
    test: /\.ts$/,
    //include: /src/,
    use: [{ loader: 'ts-loader' }]
  },
  {
    test: /\.tsx?$/,
    //include: /src/,
    exclude: /(node_modules|\.webpack)/,
    use: {
      loader: 'ts-loader',
      options: {
        transpileOnly: true,
      },
    },
  },
  { // https://babeljs.io/setup#installation
    test: /\.jsx?$/,
    exclude: /(node_modules|\.webpack)/,
    use: {
      loader: 'babel-loader',
      options: {
        presets: ['@babel/preset-env']
      }
    }
  },
  {
    test: /\.pcss$/,
    type: 'asset',
    use: {
      loader: 'postcss-loader',
      options: {
        sourceMap: true,
        //plugins: [
          //"postcss-preset-env",
        //],
      },
    },
  },
  {
    test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/,
    use: 'url-loader',
  },

  {
    test: /\.css$/i,
    type: 'asset', 
    use: ["style-loader", "css-loader"],
    generator: {
      outputPath: '.webpack/assets/css/'
    },
  }
];

postcss.config.js

module.exports = {
    plugins: {
        tailwindcss: {},
        autoprefixer: {},
    },
};

tailwind.config.js

module.exports = {
    future: {
        removeDeprecatedGapUtilities: true,
        purgeLayersByDefault: true,
    },
    content: [
      './src/**/*.{js,ts}'
    ],
    theme: {
        extend: {},
        typography: {
            default: {
                css: {
                    code: {
                        color: 'none',
                        backgroundColor: 'none',
                    },
                    pre: {
                        color: 'none',
                        backgroundColor: 'none',
                        paddingTop: 'auto',
                        paddingLeft: 'auto',
                        paddingBottom: 'auto',
                        paddingRight: 'auto',
                    },
                    'pre code': {
                        padding: 'auto',
                        backgroundColor: 'auto',
                        borderWidth: 'auto',
                        borderRadius: 'auto',
                        color: 'auto',
                        lineHeight: 'auto',
                    },
                },
            },
        },
    },
    variants: {},
    // eslint-disable-next-line global-require
    plugins: [require('@tailwindcss/typography')],
};

tsconfig.json

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "display": "Node 16",
  "compilerOptions": {
    "allowJs": true,
    "lib": ["es2021", "dom"],
    "module": "commonjs",
    "target": "es2021",
    "skipLibCheck": true,
    "esModuleInterop": true,
    "jsx": "react",
    "noImplicitAny": false,
    "sourceMap": true,
    "baseUrl": "./src",
    "outDir": "dist",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "paths": {
      "@app/*": ["app/*"],
      "*": ["node_modules/*"]
    }
  },
  "include": ["./src/**/*"]
}

依赖版本

"@electron-forge/plugin-webpack": "6.0.0-beta.63",
"@types/webpack-env": "^1.17.0",
"fork-ts-checker-webpack-plugin": "^7.2.11",
"postcss": "^8.4.14",
"postcss-loader": "^7.0.0",
"style-loader": "^3.3.1",
node: v16.15.1
O.S. : Ubuntu 20.04 Desktop
"tailwindcss": "^3.1.2",
"typescript": "~4.5.4"

解决方案

核心修改:调整Webpack对.pcss文件的处理规则

错误根源是将.pcss文件设置为type: 'asset',Webpack会将其视为资源文件尝试生成Data URL,但.pcss没有对应的MIME类型,导致报错。正确的做法是通过PostCSS编译.pcss为普通CSS,再注入到页面中。

修改webpack.rules.js中的.pcss规则,替换为以下内容:

{
  test: /\.pcss$/,
  use: [
    'style-loader', // 将编译后的CSS注入到页面
    'css-loader', // 解析CSS中的import和url()
    {
      loader: 'postcss-loader', // 用PostCSS编译pcss
      options: {
        sourceMap: true,
      },
    },
  ],
}

额外优化:清理重复的CSS规则

webpack.renderer.config.js和webpack.rules.js中都有.css的处理规则,存在重复。建议删除webpack.renderer.config.js中添加的CSS规则,保留webpack.rules.js中的规则并调整为和pcss一致的处理方式(去掉type: 'asset'):

{
  test: /\.css$/i,
  use: ["style-loader", "css-loader"],
}

验证修改

重新启动Electron Forge项目,此时.pcss文件会被正确编译为CSS并注入到页面,错误消失。


内容的提问来源于stack exchange,提问作者Raphael10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:48:21