在react_on_rails应用程序中导入.css时,Webpack加载程序失败了吗?

时间:2017-06-09 20:14:23

标签: reactjs webpack loader react-datetime

我正在尝试在react-datetime应用中使用react-on-rails。为了使日期时间开箱即用,我需要导入GH页面上提到的CSS

在我的应用中,我将CSS复制/粘贴到名为DateTime.css的文件中:

...
import DateTime from 'react-datetime';
import '../../schedules/stylesheets/DateTime.css';
...

export default class AddDate extends React.Component {

但它给了我这个错误:

VM45976:1 Uncaught Error: Module parse failed: /Users/some/path/to/my/project/App/components/schedules/stylesheets/DateTime.css Unexpected token (1:0)
You may need an appropriate loader to handle this file type.
| .rdt {
|   position: relative;
| }

似乎CSS加载器无法正常工作。我在纯反应应用程序(create-react-app)上试过这个并且它有效。当我在react_on_rails里面做的时候它就破了。

这是我的webpack配置atm(标准的开箱即用的react_on_rails):

const webpack = require('webpack');
const { resolve } = require('path');

const ManifestPlugin = require('webpack-manifest-plugin');
const webpackConfigLoader = require('react-on-rails/webpackConfigLoader');

const configPath = resolve('..', 'config');
const { devBuild, manifest, webpackOutputPath, webpackPublicOutputDir } =
  webpackConfigLoader(configPath);

const config = {

  context: resolve(__dirname),

  entry: {
    'webpack-bundle': [
      'es5-shim/es5-shim',
      'es5-shim/es5-sham',
      'babel-polyfill',
      './app/bundles/App/startup/registration',
    ],
  },

  output: {
    // Name comes from the entry section.
    filename: '[name]-[hash].js',

    // Leading slash is necessary
    publicPath: `/${webpackPublicOutputDir}`,
    path: webpackOutputPath,
  },

  resolve: {
    extensions: ['.js', '.jsx'],
  },

  plugins: [
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development', // use 'development' unless process.env.NODE_ENV is defined
      DEBUG: false,
    }),
    new ManifestPlugin({ fileName: manifest, writeToFileEmit: true }),
  ],

  module: {
    rules: [
      {
        test: require.resolve('react'),
        use: {
          loader: 'imports-loader',
          options: {
            shim: 'es5-shim/es5-shim',
            sham: 'es5-shim/es5-sham',
          },
        },
      },


    {
        test: /\.jsx?$/,
        use: 'babel-loader',
        exclude: /node_modules/,
      },
      {
        test: /\.css$/,
        use: 'css-loader',
        exclude: /node_modules/,
      },
    ],
        ],
      },
    };

module.exports = config;

if (devBuild) {
  console.log('Webpack dev build for Rails'); // eslint-disable-line no-console
  module.exports.devtool = 'eval-source-map';
} else {
  console.log('Webpack production build for Rails'); // eslint-disable-line no-console
}

我是webpack中的新手,并且不确定如何添加加载器以使其正常工作,如何应用我必须应用于DateTime.css的{​​{1}}文件?

编辑:添加了css-loader(也更新了上面的webpack)。它不再抱怨我没有正确的加载器,但CSS不起作用。

react-datetime

1 个答案:

答案 0 :(得分:0)

有两种概念上不同的方法可以解决这个问题。

<强> 1。使用CSS模块。 这样你的CSS最终将与你的JS捆绑在一起,一旦webpack加载了JS模块/ bundle,它就会自动将CSS样式元素附加到头部。 在我的项目中,我有这样的规则(请注意我们同时使用css-loaderstyle-loader):

{
    test: /\.css$/,
    use: ['style-loader', {
        loader: 'css-loader',
        options: {
            modules: true,
            localIdentName: '[path][name]__[local]--[hash:base64:5]'
        }
    }]
}

有关css-loader的更多信息modules at this link

<强> 2。使用ExtractTextPlugin 。这样,所有CSS都将被提取到一个单独的文件中。配置需要两件事:插件创建的插件和加载器配置:

const ExtractTextPlugin = require('extract-text-webpack-plugin');
// Add this to your webpack plugins array
new ExtractTextPlugin('styles.css')

并将其添加到您的规则中:

{
    test: /\.css$/,
    exclude: /node_modules/,
    use: ExtractTextPlugin.extract({
        fallback: 'style-loader',
        use: ['css-loader']
    })
}

这将创建一个单styles.css个文件,并将您从JS导入的所有CSS放入该文件中。