Webpack загрузчики для CSS и SCSS

0

Я использовал.scss файлы для своего приложения-ответчика и должен был использовать сторонний компонент, требующий файл.css. Я обновил файл webpack.config до:

import path from 'path';
import webpack from 'webpack';
import extend from 'extend';
import AssetsPlugin from 'assets-webpack-plugin';

const DEBUG = !process.argv.includes('--release');
const VERBOSE = process.argv.includes('--verbose');
const AUTOPREFIXER_BROWSERS = [
  'Android 2.3',
  'Android >= 4',
  'Chrome >= 35',
  'Firefox >= 31',
  'Explorer >= 9',
  'iOS >= 7',
  'Opera >= 12',
  'Safari >= 7.1',
];
const GLOBALS = {
  'process.env.NODE_ENV': DEBUG ? '"development"' : '"production"',
  __DEV__: DEBUG,
};

//
// Common configuration chunk to be used for both
// client-side (client.js) and server-side (server.js) bundles
// -----------------------------------------------------------------------------

const config = {
  output: {
    publicPath: '/',
    sourcePrefix: '  ',
  },

  cache: DEBUG,
  debug: DEBUG,

  stats: {
    colors: true,
    reasons: DEBUG,
    hash: VERBOSE,
    version: VERBOSE,
    timings: true,
    chunks: VERBOSE,
    chunkModules: VERBOSE,
    cached: VERBOSE,
    cachedAssets: VERBOSE,
  },

  plugins: [
    new webpack.optimize.OccurenceOrderPlugin(),
  ],

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

  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        include: [
          path.resolve(__dirname, '../node_modules/react-routing/src'),
          path.resolve(__dirname, '../src'),
        ],
        loader: 'babel-loader',
    }, {
        test: /\.css$/,
        loaders: [ 'style-loader', 'css-loader?module&localIdentName=[local]'],
      },
    {
        test: /\.scss$/,
        loaders: [
          'isomorphic-style-loader',
          'css-loader?${DEBUG ? 'sourceMap&' : 'minimize&'}modules&localIdentName=' +
          '${DEBUG ? '[name]_[local]_[hash:base64:3]' : '[hash:base64:4]'}',
          'postcss-loader?parser=postcss-scss',
        ],
      }, {
        test: /\.json$/,
        loader: 'json-loader',
      }, {
        test: /\.txt$/,
        loader: 'raw-loader',
      }, {
        test: /\.(png|jpg|jpeg|gif|svg|woff|woff2)$/,
        loader: 'url-loader?limit=10000',
      }, {
        test: /\.(eot|ttf|wav|mp3)$/,
        loader: 'file-loader',
      },
    ],
  },

  postcss: function plugins(bundler) {
    return [
      require('postcss-import')({ addDependencyTo: bundler }),
      require('precss')(),
      require('autoprefixer')({ browsers: AUTOPREFIXER_BROWSERS }),
    ];
  },
};

//
// Configuration for the client-side bundle (client.js)
// -----------------------------------------------------------------------------

const clientConfig = extend(true, {}, config, {
  entry: './src/client.js',
  output: {
    path: path.join(__dirname, '../build/public'),
    filename: DEBUG ? '[name].js?[hash]' : '[name].[hash].js',
  },

  // Choose a developer tool to enhance debugging
  // http://webpack.github.io/docs/configuration.html#devtool
  devtool: DEBUG ? 'cheap-module-eval-source-map' : false,
  plugins: [
    new webpack.DefinePlugin(GLOBALS),
    new AssetsPlugin({
      path: path.join(__dirname, '../build'),
      filename: 'assets.js',
      processOutput: x => 'module.exports = ${JSON.stringify(x)};',
    }),
    ...(!DEBUG ? [
      new webpack.optimize.DedupePlugin(),
      new webpack.optimize.UglifyJsPlugin({
        compress: {
          // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
          screw_ie8: true,

          // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
          warnings: VERBOSE,
        },
      }),
      new webpack.optimize.AggressiveMergingPlugin(),
    ] : []),
  ],
});

//
// Configuration for the server-side bundle (server.js)
// -----------------------------------------------------------------------------

const serverConfig = extend(true, {}, config, {
  entry: './src/server.js',
  output: {
    path: './build',
    filename: 'server.js',
    libraryTarget: 'commonjs2',
  },
  target: 'node',
  externals: [
    /^\.\/assets$/,
    function filter(context, request, cb) {
      const isExternal =
        request.match(/^[@a-z][a-z\/\.\-0-9]*$/i) &&
        !request.match(/^react-routing/) &&
        !context.match(/[\\/]react-routing/);
      cb(null, Boolean(isExternal));
    },
  ],
  node: {
    console: false,
    global: false,
    process: false,
    Buffer: false,
    __filename: false,
    __dirname: false,
  },
  devtool: 'source-map',
  plugins: [
    new webpack.DefinePlugin(GLOBALS),
    new webpack.BannerPlugin('require("source-map-support").install();',
      { raw: true, entryOnly: false }),
  ],
});

export default [clientConfig, serverConfig];

Однако, когда я пытаюсь запустить свое приложение, я получаю SyntaxError: Unexpected Token. Я новичок в webpack, поэтому я не уверен, что мне здесь не хватает. Что мне нужно изменить, чтобы использовать.css файлы, а также.scss файлы в моем приложении?

Полное сообщение об ошибке: SyntaxError: Unexpected token. at exports.runInThisContext(vm.js:53:16) at Module._compile (module.js:387:25) at Object.Module._extensions..js(module.js:422:10) at Module.load(module.js:357:32) at Function.Module._load (module.js:314:12) at Module.require(module.js:367:17) at require (internal/module.js:16:19) at Object.<anonymous> (/Users/erichardson/Projects/interview_react/build/webpack: /external "react-flexr/styles.css":1:1) at __webpack_require__ (/Users/erichardson/Projects/interview_react/build/webpack: /webpack/bootstrap 1793a21c8f893ac9d09a:19:1) at Object.<anonymous> (/Users/erichardson/Projects/interview_react/build/server.js:3659:3) SyntaxError: Unexpected token. at exports.runInThisContext(vm.js:53:16) at Module._compile (module.js:387:25) at Object.Module._extensions..js(module.js:422:10) at Module.load(module.js:357:32) at Function.Module._load (module.js:314:12) at Module.require(module.js:367:17) at require (internal/module.js:16:19) at Object.<anonymous> (/Users/erichardson/Projects/interview_react/build/webpack: /external "react-flexr/styles.css":1:1) at __webpack_require__ (/Users/erichardson/Projects/interview_react/build/webpack: /webpack/bootstrap 1793a21c8f893ac9d09a:19:1) at Object.<anonymous> (/Users/erichardson/Projects/interview_react/build/server.js:3659:3)

  • 0
    Удалите 'postcss-loader?parser=postcss-scss' из * .css loader (где условие соответствия - test: /\.css$/ ).
  • 0
    @BobSponge Я все еще получаю ту же ошибку
Показать ещё 6 комментариев
Теги:
sass
webpack

1 ответ

1
Лучший ответ

Стили файла react-flexr/styles.css разрешены как внешние. Итак, вам нужно:

1) Измените 'style-loader' на 'isomorphic-style-loader', потому что вы используете его в пакете на стороне сервера.

2) Обновить функцию filter во externals разделе, чтобы react-flexr/styles.css не разрешалось как внешнее:

function filter(context, request, cb) {
  const isExternal =
    request.match(/^[@a-z][a-z\/\.\-0-9]*$/i) &&
    !request.match(/^react-flexr\/styles\.css/) &&
    !request.match(/^react-routing/) &&
    !context.match(/[\\/]react-routing/);
  cb(null, Boolean(isExternal));
}
  • 0
    Спасибо, что сработало. Теперь я должен изменить функцию фильтра на выражение регулярного выражения, чтобы искать все файлы .css, а не только этот конкретный?
  • 0
    Я думаю, что вы можете сохранить этот код, потому что react-flexr работает со стилями не в общих react-flexr .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню