类名不出现React

时间:2017-10-21 06:36:48

标签: javascript reactjs webpack extract-text-plugin

不确定我哪里错了。这是我的webpack.prod用于捆绑客户端。但有些类似乎没有出现在我的HTML

const path = require('path');
const webpack = require('webpack');
const dependencies = require('./package.json');
const ManifestPlugin = require('webpack-manifest-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');

const VENDOR_LIBS = [];
Object.entries(dependencies.dependencies).forEach(([key, value]) => {
  VENDOR_LIBS.push(key);
});

const BrowserConfig = {
  entry: {
    bundle: './src/index',
    vendor: VENDOR_LIBS,
  },
  output: {
    path: path.resolve('./dist'),
    publicPath: '/',
    filename: '[name].js',
    pathinfo: true,
  },
  resolve: {
    extensions: ['.js', '.jsx', '.json', '.scss', '.css'],
  },
  module: {
    rules: [
      {
        use: ['react-hot-loader/webpack', 'babel-loader'],
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
      },
      {
        test: /\.(woff|woff2|eot|ttf|svg|otf)$/,
        use: 'file-loader?limit=1024&name=fonts/[name].[ext]',
      },
      {
        test: /\.(gif|jpe?g|png|ico)$/,
        loader: ['file-loader?name=images/[name].[ext]&limit=100000'],
      },
      {
        test: /\.(scss|css)$/,
        exclude: /node_modules/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: [
            { loader: 'css-loader',
              options: {
                sourceMap: true,
                camelCase: true,
                minimize: true,
                namedExport: true,
                modules: true,
                importLoaders: 2,
                localIdentName: '[hash:base64:5]',
              },
            },
            { loader: 'postcss-loader',
              options: {
                sourceMap: true,
                plugins: () => ([
                  require('autoprefixer')({
                    browsers: ['last 2 versions', 'ie >= 9'],
                  }),
                ]),
              },
            },
            // { loader: 'sass-loader', options: { sourceMap: true } },
          ],
        }),
      },
    ],
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.optimize.OccurrenceOrderPlugin(),
    new webpack.optimize.CommonsChunkPlugin({
      name: ['vendor'],
    }),
    new CleanWebpackPlugin(['dist']),
    new webpack.NoEmitOnErrorsPlugin(),
    new webpack.optimize.AggressiveMergingPlugin(),
    new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': JSON.stringify(process.env.NODE_ENV),
      },
      BROWSER: true,
      DEBUG: false,
      __DEVTOOLS__: false,
    }),
    new ManifestPlugin({
      fileName: './manifest.json',
    }),
    new ExtractTextPlugin({
      filename: '[name].css',
      allChunks: true,
    }),
  ],
  devServer: {
    contentBase: './dist',
    hot: true,
    historyApiFallback: true,
  },
  devtool: 'source-map',
};

module.exports = BrowserConfig;

这是header.js文件,其中,我从header.scss文件导入样式。

import React, { Component } from 'react';
import styles from './header.scss';

    class Header extends Component {
      render() {
        return (
          <div className={ styles.headerContainer }>This is Header</div>
        );
      }
    }

    export default Header;

header.scss文件包含以下代码:

.headerContainer{
  border: 1px solid #ddd;
}

这是我的控制台的屏幕截图,其中没有出现类。 enter image description here

我在package.json

中包含了以下依赖项
{
  "name": "wander",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "NODE_ENV='development' webpack --config='webpack.server.js' && node dist/serverdist.js",
    "build": "NODE_ENV='production' webpack -p --config='webpack.prod' && NODE_ENV='production' webpack -p --config='webpack.server' && node dist/serverdist.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "history": "^4.7.2",
    "react": "^16.0.0",
    "react-dom": "^16.0.0",
    "react-redux": "^5.0.6",
    "react-router": "^4.2.0",
    "react-router-dom": "^4.2.2",
    "redux": "^3.7.2"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.5",
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-css-modules-transform": "^1.2.7",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "babel-preset-stage-1": "^6.24.1",
    "clean-webpack-plugin": "^0.1.17",
    "compression-webpack-plugin": "^1.0.1",
    "css-loader": "^0.28.7",
    "eslint": "^4.8.0",
    "eslint-config-airbnb": "^15.1.0",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-jsx-a11y": "^6.0.2",
    "eslint-plugin-react": "^7.4.0",
    "express": "^4.16.1",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "html-webpack-plugin": "^2.30.1",
    "json-loader": "^0.5.7",
    "node-sass": "^4.5.3",
    "postcss-loader": "^2.0.6",
    "react-hot-loader": "^3.0.0-beta.7",
    "sass-loader": "^6.0.6",
    "style-loader": "^0.18.2",
    "url-loader": "^0.5.9",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-middleware": "^1.12.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-hot-middleware": "^2.19.1",
    "webpack-manifest-plugin": "^1.3.2",
    "webpack-node-externals": "^1.6.0"
  }
}
在服务器端上的

我有这样的代码;

app.use(express.static('dist'));

app.get('*', (req, res) => {
  if (process.env.NODE_ENV === 'production') {
    res.send(`
      <!DOCTYPE html>
      <head>
        <title>Wander Blog</title>
        <link rel="stylesheet" type="text/css" href="/bundle.css">
      </head>
      <body>
        <div id='app'>${renderToString(<App />)}</div>
        <script type="text/javascript" src="/vendor.js" defer></script>
        <script type="text/javascript" src="/bundle.js" defer></script>
      </body>
    </html>
  `);
  }
});

3 个答案:

答案 0 :(得分:3)

您正在混合使用内联样式和CSS的概念。

<div className={ styles.headerContainer }>This is Header</div>

className定义为scss文件中的名称。

<div className='headerContainer'>This is Header</div>

如果您希望将来使用内联样式,您应该使用style道具制作内联样式的对象。

<div style={styles.headerContainer}>This is Header</div>

但同样,我必须强调CSS和内联样式相同。

答案 1 :(得分:1)

只能使用style-loader将CSS直接加载到组件的类名中,extract-text-plugin仅用作style-loader的后备。

您还必须将use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: [ 'style-loader', { loader: 'css-loader', options: { sourceMap: true, camelCase: true, minimize: true, namedExport: true, modules: true, importLoaders: 2, localIdentName: '[hash:base64:5]', }, }, { loader: 'postcss-loader', options: { sourceMap: true, plugins: () => ([ require('autoprefixer')({ browsers: ['last 2 versions', 'ie >= 9'], }), ]), }, }, { loader: 'sass-loader', options: { sourceMap: true } }, ], }), }, ], }, 添加到您的加载程序列表中。像这样:

if ($age=="") {
    $errMsg .= "<p>You must enter your age.</p>";
} else if (!is_numeric($var),$age)) {
    $errMsg .= "<p>Your age must be a number.</p>";
} else if ($age > 14) {
    $errMsg .= "<p>You must be 15 or older to apply for this job.</p>";
} else if ($age < 81) {
    $errMsg .= "<p>You must be 80 or younger to apply for this job.</p>";
}

另外,如果你使用sass,你也应该使用sass-loader。

答案 2 :(得分:0)

只需在className="headerContainer"文件中使用header.js