Webpack 1.15.0 FeathersJS React Redux Стили пользовательского интерфейса материала, не скомпилированные или не присутствующие в визуализированной DOM

мне было чрезвычайно трудно определить, почему мои таблицы стилей, кажется, игнорируются в пакете, который я пытаюсь изменить для собственного использования. Не уверен, что это проблема с Material-UI или самим Webpack, но любые операторы require или import, которые я добавляю в заголовок любых ошибок документа .js, выдают при запуске скрипта сборки. Тот же импорт для «стиля импорта из ./style.css» работает с документами из исходного репозитория.

Лучше всего, что я могу анализировать конфигурации Webpack, которые я использую, похоже, игнорирует любые таблицы стилей, кроме тех, которые были включены в исходный пакет, И любые изменения в таблицах стилей, которые визуализируются в DOM, также игнорируются. Все, что я исследовал, указывает на то, что эта конфигурация работает и не выдает ошибок при запуске соответствующего сценария сборки.

Пожалуйста помоги! Спасибо!

webpack.production.configjs

/* eslint-env node */
/* eslint no-console: 0, no-var: 0 */

// Webpack config for PRODUCTION and DEVELOPMENT modes.
// Changes needed if used for devserver mode.

const webpack = require('webpack');
const rucksack = require('rucksack-css');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const envalid = require('envalid');
const path = require('path');

// Validate environment variables
validateEnvironmentVariables();

const config = require('config');

if (config.NODE_ENV === 'devserver') {
  throw new Error('This webpack config does not work as is with the web-dev-server.')
}

const isProduction = config.isProduction;

const outputPublicPaths = {
  production: '/dist/',
  development: '/dist/',
  devserver: 'http://localhost:8080/', // we don't use this config for webpack-dev-server
};

console.log(`----- ${config.NODE_ENV.toUpperCase()} build.`); // eslint-disable-line no-console

// Base Webpack configuration
const webpackConfig = {
  context: path.join(__dirname, 'client'),
  // re devtool: http://cheng.logdown.com/posts/2016/03/25/679045
  devtool: isProduction ? 'cheap-module-source-map' : 'source-map',
  entry: {
    main: ['./index.js'],
    // Webpack cannot produce chunks with a stable chunk hash as of June 2016,
    // stable meaning the hash value changes only when the the code itself changes.
    // See doc/FAQ.md#webpackChunks.
    // This vendor chunk will not reduce network requests, it will likely force a second request
    // each time the main chunk changes. So why separate them?
    // Chunks for code which is dynamically optionally loaded makes sense.
    // The first page will render faster as the parsing of such chunks can be delayed
    // till they are needed.
    // Of course the React routing must be changed to load such chunks as needed.
    // Maybe we'll make the routing do that at some time.
    /*
    user: [
      // './screens/Users/UserSignIn', // sign in occurs often enough to retain in main chunk
      './screens/Users/UserEmailChange',
      './screens/Users/UserForgotPwdReset',
      './screens/Users/UserForgotPwdSendEmail',
      './screens/Users/UserPasswordChange',
      './screens/Users/UserProfile',
      './screens/Users/UserProfileChange',
      './screens/Users/UserRolesChange',
      './screens/Users/UserSignIn',
      './screens/Users/UserSignInPending',
      './screens/Users/UserSignUp',
      './screens/Users/UserSignUpSendEmail',
      './screens/Users/UserSignUpValidateEmail',
    ],
    */
  },
  output: {
    filename: '[name].bundle.[chunkhash].js',

    // Tell Webpack where it should store the resulting code.
    path: path.join(__dirname, 'public', 'dist'),
    // Give Webpack the URL that points the server to output.path
    publicPath: outputPublicPaths[config.NODE_ENV],
  },
  /* This is needed for joi to work on the browser, if the client has that dependency
  node: {
    net: 'empty',
    tls: 'empty',
    dns: 'empty',
  },
  */
  module: {
    loaders: [
      {
        // File index.html is created by html-webpack-plugin. It should be a file webpack processes.
        test: /\.html$/,
        loader: 'file?name=[name].[ext]',
      },
      {
        // When require'd, these /client/../*.inject.css files are injected into the DOM as is.
        test: /\.inject\.css$/,
        include: /client/,
        loader: 'style!css',
      },
      {
        // When required, the class names in these /client/../*.css are returned as an object.
        // after being made unique. The css with the modified class names is injected into the DOM.
        test: /^(?!.*\.inject\.css).*\.css$/,
        include: /client/,
        loaders: [
          'style-loader',
          'css-loader'
        ],
      },
      {
        // Standard processing for .css outside /client
        test: /\.css$/,
        exclude: /client/,
        loader: 'style!css',
      },
        {
        test: /\.(js|jsx)$/, // does anyone still use .jsx?
        exclude: /(node_modules|bower_components)/,
        loaders: [
                /*
                'react-hot',
                */
                'babel-loader',
            ],
        },
        {
        test: /\.(svg|woff|woff2|ttf|eot)$/,
          loader: 'file?name=assets/fonts/[name].[hash].[ext]'
      },

    ],
  },
  resolve: {
    extensions: ['', '.js', '.jsx'],
    // Reroute import/require to specific files. 'react$' reroutes 'react' but not 'react/foo'.
    alias: {
    },
  },
  postcss: [
    rucksack({
      autoprefixer: true,
    }),
  ],
  plugins: [
    // Webpack's default file watcher does not work with NFS file systems on VMs,
    // definitely not with Oracle VM, and likely not with other VMs.
    // OldWatchingPlugin is a slower alternative that works everywhere.
    new webpack.OldWatchingPlugin(), // can use "webpack-dev-server --watch-poll" instead
    /*
     Build our HTML file.
     */
    // repeat new HtmlWebpackPlugin() for additional HTML files
    new HtmlWebpackPlugin({
      // Template based on https://github.com/jaketrent/html-webpack-template/blob/master/index.ejs
      template: path.join(process.cwd(), 'server', 'utils', 'index.ejs'),
      filename: 'index.html',
      inject: false, // important
      minify: {
        collapseWhitespace: true,
        conservativeCollapse: true,
        minifyCSS: true,
        minifyJS: true,
        preserveLineBreaks: true, // leave HTML readable
      },
      cache: false,
      /* We'd need this if we had a dynamically loaded user chunk
      excludeChunks: ['user'],
       */

      // Substitution values
      supportOldIE: false,
      meta: { description: config.client.appName },
      title: config.client.appName,
      faviconFile: '/favicon.ico',
      mobile: false,
      links: [],
      baseHref: null,
      unsupportedBrowserSupport: false,
      appMountId: 'root',
      appMountIds: {},
      addRobotoFont: true, // See //www.google.com/fonts#UsePlace:use/Collection:Roboto:400,300,500
      copyWindowVars: {},
      scripts: ['/socket.io/socket.io.js'],
      devServer: false,
      googleAnalytics: false,
    }),
    new webpack.DefinePlugin({
      'process.env': { NODE_ENV: JSON.stringify(config.NODE_ENV) }, // used by React, etc
      __processEnvNODE_ENV__: JSON.stringify(config.NODE_ENV), // used by us
    }),
  ],
};

// Production customization

if (isProduction) {
  webpackConfig.plugins.push(
    /*
     Besides the normal benefits, this is needed to minify React, Redux and React-Router
     for production if you choose not to use their run-time versions.
     */
    new webpack.optimize.UglifyJsPlugin({
      compress: { warnings: false },
      comments: false,
      sourceMap: false,
      mangle: true,
      minimize: true,
      verbose: false,
    })
  );
}

module.exports = webpackConfig;

// Validate environment variables
function validateEnvironmentVariables() {
  const strPropType = envalid.str;

  // valid NODE_ENV values.
  const nodeEnv = {
    production: 'production',
    prod: 'production',
    development: 'development',
    dev: 'development',
    devserver: 'devserver',
    testing: 'devserver',
    test: 'devserver',
  };

  const cleanEnv = envalid.cleanEnv(process.env,
    {
      NODE_ENV: strPropType({
        choices: Object.keys(nodeEnv),
        default: 'developmwent',
        desc: 'processing environment',
      }),
    }
  );

  process.env.NODE_ENV = nodeEnv[cleanEnv.NODE_ENV];
}

person lexparsimonet    schedule 11.10.2017    source источник
comment
Ваш вопрос сбивает с толку. Вы говорите, что некоторые css из пакетов node_modules не загружаются или ВАШИ файлы css не загружаются? Можете ли вы опубликовать структуру папок вашего проекта. Что находится в каталоге /client?   -  person Chase DeAnda    schedule 11.10.2017
comment
Приносим извинения за плохо сформулированный вопрос / объяснение - мои документы css не загружаются, несколько таблиц стилей за пределами загрузки node_modules (все в каталоге клиентов), ничто в иерархии экранов не является импортом или требованием для любых документов * .css вне клиентов. См. ссылку для получения информации о структуре каталогов.   -  person lexparsimonet    schedule 12.10.2017
comment
Прочитав мой исходный вопрос еще раз, подумал, что должен уточнить, что операторы «import style from './style.css'» не вызывают ошибок, но стили не отображаются в DOM. Флаг --displaymodules выводит хеш-строку из css-loader: css-loader?modules&sourceMap&importLoaders=1&localIdentName=' + '[name]__[local]___[hash:base64:5]' [not cached] 0 bytes, а затем путь к каждой таблице стилей. URI http: // blob для стиля также печатается в <head>, но стили все еще не отображаются в DOM. Что мне не хватает?   -  person lexparsimonet    schedule 12.10.2017


Ответы (1)


На первый взгляд, вам нужно добавить -loader к каждому загрузчику. Вы сделали это для одного, но не для двух других:

{
    // When require'd, these /client/../*.inject.css files are injected into the DOM as is.
    test: /\.inject\.css$/,
    include: /client/,
    loaders: [
      'style-loader',
      'css-loader'
    ]
  },
  {
    // When required, the class names in these /client/../*.css are returned as an object.
    // after being made unique. The css with the modified class names is injected into the DOM.
    test: /^(?!.*\.inject\.css).*\.css$/,
    include: /client/,
    loaders: [
      'style-loader',
      'css-loader'
    ],
  },
  {
    // Standard processing for .css outside /client
    test: /\.css$/,
    exclude: /client/,
    loaders: [
      'style-loader',
      'css-loader'
    ]
  },
person Chase DeAnda    schedule 11.10.2017
comment
изменил мой блок 'module: {loaders', как вы предложили выше, но все еще не работает. - Плохая форма с моей стороны, исходный блок webpack.production.config.js включал строку с css-loader, которая, как мне кажется, имела какое-то отношение к синтаксическому анализу полученного пакета, но строка также просто выводилась в терминал как простой текст, когда завершение сценария build: dev с помощью --display-modules. Если он присутствует как таковой: ссылка - person lexparsimonet; 12.10.2017
comment
@lexparsimonet, почему вы устанавливаете inject на false в htmlwebpackplugin ?? Из документации это определяет, будут ли ваши файлы вставлены в ваш index.html. Вы можете удалить эту строку и посмотреть, изменится ли это что-нибудь? - person Chase DeAnda; 12.10.2017
comment
сделал, как вы предложили, без разницы. Я оставил параметр HtmlWebpackPlugin таким, каким он был установлен в исходном дистрибутиве репозитория git, который я клонировал. Комментарий в документе, который я, скорее всего, пропустил, и readme не подразумевает и не указывает, что это необходимо изменить. Также добавлен параметр hash: true без разницы в выводе. Посмотрите ссылку, если хотите увидеть то, что я вижу - несколько blob в заголовке таблиц стилей, но ничего в них не отображает. Также установите загрузчик на .woff для загрузки шрифтов, и ничего. Спасибо за помощь - person lexparsimonet; 12.10.2017
comment
Не похоже, что ваши файлы css находятся в папке dist. Единственное, что я вижу, это файл main.js. Капли добавляются правильно, но файлы объединяются и хранятся в папке dist. - person Chase DeAnda; 12.10.2017
comment
Можете ли вы показать мне, где вы импортируете свои файлы css в свой код? Вы должны импортировать файлы css где-нибудь в своем приложении. - person Chase DeAnda; 12.10.2017
comment
Обе ссылки были на одну и ту же страницу. Но, глядя на импорт, который не сработал, вместо выполнения import style from './style.css' вы должны выполнить import './style.css'. Сообщите мне, если это что-то изменит. - person Chase DeAnda; 13.10.2017
comment
Операторы импорта разбросаны по каталогу Client / screen / Users в соответствующих документах index.js. Посмотрите здесь ссылку для относительного размещения import style from './style.css'; инструкций в каталоге stylesheet / index.js. Посмотрите здесь ссылка для UserSignIn\index.js примера импорта, который не работает. Посмотрите здесь ссылка для оператора импорта, который" действительно ", похоже, отображает / не использует неиспользуемый импорт IDE / ESLint, надеюсь, это покажет вам то, о чем вы просили. Еще раз большое спасибо - person lexparsimonet; 13.10.2017
comment
Сделайте множество открытых окон pastebin с высоким содержанием кофеина, извините за избыточные URL-адреса. из всех import использований синтаксиса, которые я пробовал, import './style.css' РАБОТАЕТ. СПАСИБО, я бился головой о стол в течение нескольких дней, а точнее недели и изменил это, несмотря на то, что работал над проектом React, где import from './file.ext' работал отлично. СПАСИБО еще раз за серьезное. - Ради информации, в чем разница между import from './file.ext' и простым import? - person lexparsimonet; 13.10.2017
comment
@lexparsimonet Потрясающе рад, что у вас все заработало! Когда вы делаете import ... from './path', вы выполняете экспорт по умолчанию из файла. Это означает, что в импортируемом файле должен быть export default something в конце файла. С таблицами стилей нам не нужно импортировать ничего конкретного, вместо этого мы можем просто импортировать весь файл, не имея from в импорте. Итак, import './style.css' просто сообщает Webpack, что мне нужно включить этот файл целиком в приложение. - person Chase DeAnda; 13.10.2017