Сервер разработки Webpack медленно компилируется при изменении css с помощью tailwind

#webpack #postcss #tailwind-css

#webpack #postcss #tailwind-css

Вопрос:

Я использую webpack, tailwind и postcss. Я видел во многих местах людей, говорящих, что postcss быстрее, чем libsass, но для меня он работает намного медленнее.

В libsass, если я вношу изменения в файл scss, он компилируется примерно за 40 мс. С моей настройкой webpack при запуске сервера разработки каждый раз, когда я вношу изменение css, требуется 1000-1500 мс. Я знаю, что это не радикально, но этого достаточно, чтобы раздражать меня, когда я привык к почти мгновенным обновлениям моего второго монитора.

Я думаю, что проблема в моей настройке webpack. Моя основная точка входа index.tsx . Сначала внутри этого файла я импортировал свой css, поэтому в итоге получал:

  • bundle.js
  • bundle.css

Каждый раз, когда я вносил изменения, приходилось все перекомпилировать, и только css tailwind составляет несколько Мб, так что, я думаю, именно поэтому он медленный.

Если я внесу изменения в небольшой пользовательский css, ему придется перекомпилировать все js и tailwind css, который не изменился.

Поэтому в идеале я хочу, чтобы эти файлы выводились:

  • bundle.js — все файлы ts, на которые ссылаются из index.ts
  • bundle.css — если на какой-либо css есть ссылка из javascript, он будет отправлен сюда
  • tailwind.css — это скомпилированные стили tailwind
  • main.css — это всего лишь мои собственные стили, и они должны компилироваться очень быстро, потому что это относительно небольшой файл

Я удалил импорт css из index.tsx и использовал эту конфигурацию:

 const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  entry: {
    'bundle': './src/index.tsx',
    'tailwind': './src/css/tailwind.css',
    'main': './src/css/main.css',
  },
  mode: 'development',
  devtool: 'inline-source-map',
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css',
    }),
  ],
  module: {

    rules: [
      {
        test: /.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
      {
        test: /.css$/,
        exclude: /node_modules/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // // only enable hot in development
              hmr: process.env.NODE_ENV === 'development',
              // // if hmr does not work, this is a forceful method.
              // reloadAll: true,
            }
          },
          {
            loader: 'css-loader',
            options: {
              importLoaders: 1,
            }
          },
          {
            loader: 'postcss-loader'
          }
        ],
      },
    ],
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js', '.jsx'],
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, 'dist'),
  },
  devServer: {
    contentBase: './dist',
    port: 3366,
    hot: true,
    writeToDisk: true
  },
};
  

Это выводит все файлы, о которых я упоминал, которые я хотел, но также выводит нежелательный файл main.js и tailwind.js .

Когда я вношу изменения в main.css с запущенным сервером разработки, все перестраивается, а не только этот файл. При этом начальная сборка выполняется в то же время, а вторая сборка после обновления выполняется примерно на 200 мс быстрее, но по-прежнему не приближается к производительности работы с libsass.

Что мне нужно сделать, чтобы я мог редактировать main.css , и только эта часть будет быстро собираться?

Комментарии:

1. Я не уверен, что это полезно, но у меня тоже была очень медленная компиляция с tailwind, и что помогло, так это удалить плагин autoprefixer из postcss. Может быть, вы могли бы попробовать сделать что-то подобное, постепенно удаляя плагины, которые не нужны для разработки.

2. Я выяснил, что если я разделю свою конфигурацию webpack на несколько конфигураций, то она будет перестраивать каждую конфигурацию отдельно, таким образом, устраняя проблему скорости, поскольку я мог отделить свой пользовательский css от его собственной конфигурации. Спасибо за предложение, хотя

Ответ №1:

Для Tailwind2 метод разделения может больше не работатьhttps://github.com/tailwindlabs/tailwindcss/issues/2544