【问题标题】:Getting css output using webpack ExtractTextPlugin使用 webpack ExtractTextPlugin 获取 css 输出
【发布时间】:2015-06-26 03:24:05
【问题描述】:

我正在尝试使用 ExtractTextPlugin 让 css 需要在 webpack 中工作,但没有成功

我想要一个单独的 css 文件而不是内联任何 css。

这是我的 webpack 配置:

var path = require('path');
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  devtool: 'eval',
  entry: [
    'webpack-dev-server/client?http://localhost:3000',
    'webpack/hot/only-dev-server',
    './scripts/index'
  ],
  output: {
    path: path.join(__dirname, 'build'),
    filename: 'bundle.js',
    publicPath: '/scripts/'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin(),
    new ExtractTextPlugin('styles/styles.css', {
      allChunks: true
    })
  ],
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  module: {
    loaders: [{
      test: /\.jsx?$/,
      loaders: ['react-hot', 'babel'],
      include: path.join(__dirname, 'scripts')
    },
    {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract('style-loader', 'css-loader')
    }]
  }
};

index.js:

import React from 'react';
import App from './App';

React.render(<App />, document.getElementById('root'));

App.js:

import React from 'react';

require('../styles/app.css');

export default class App extends React.Component {
  render() {
    return (
      <h1>Hello, world.</h1>
    );
  }
}

index.html:

<html>
  <head>
    <link rel="stylesheet" href="/styles/styles.css">
  </head>
  <body>
    <div id='root'></div>
  </body>
  <script src="/scripts/bundle.js"></script>
</html>

styles.css 返回 404

知道这里可能出了什么问题。如果我不使用 ExtractTextPlugin 而只是在配置中执行此操作:

module: {
        loaders: [
            { test: /\.css$/, loader: "style-loader!css-loader" }
        ]
    }

然后我将 css 正确应用到页面,但显然这不是来自 css 文件

这是我第一次尝试使用 webpack,所以可能会犯一些菜鸟错误

有什么想法吗?

【问题讨论】:

  • 我设法让它与 font-awesome-webpack 一起工作,但我也遇到了 css 问题。 npmjs.com/package/…
  • 可以搭建一个独立的项目(即GitHub)来学习吗?
  • 您能否将答案标记为已接受或描述什么不起作用?

标签: webpack


【解决方案1】:

ExtractTextPlugin 需要在两个地方添加:在加载器中,以及作为插件。这是从stylesheets documentation 中提取的示例。

// webpack.config.js
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
    // The standard entry point and output config
    entry: {
        posts: "./posts",
        post: "./post",
        about: "./about"
    },
    output: {
        filename: "[name].js",
        chunkFilename: "[id].js"
    },
    module: {
        loaders: [
            // Extract css files
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract("style-loader", "css-loader")
            },
            // Optionally extract less files
            // or any other compile-to-css language
            {
                test: /\.less$/,
                loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
            }
            // You could also use other loaders the same way. I. e. the autoprefixer-loader
        ]
    },
    // Use the plugin to specify the resulting filename (and add needed behavior to the compiler)
    plugins: [
        new ExtractTextPlugin("[name].css")
    ]
}

【讨论】:

  • 在较新的版本中,它只接受一个对象作为参数:ExtractTextPlugin.extract({fallback: "style-loader", use: "css-loader"}) (docs)
  • { context: __dirname + '/app', entry: { app: './index.js', vendor: ['angular', ...] },输出:{路径:__dirname +'/app/bundle/js/',文件名:'bundle.js'},模块:{规则:[{测试:/\.css$/,加载器:ExtractTextPlugin.extract({ fallback : "style-loader", 使用: "css-loader" }) } ] }, 插件: [ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.bundle.js' }), new ExtractTextPlugin("[name].css") ]};
【解决方案2】:

我已经修改了你的配置文件名以及你如何将它们包含在页面中

   var path = require('path');
   var webpack = require('webpack');
   var ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  devtool: 'eval',
  entry: [
    'webpack-dev-server/client?http://localhost:3000',
    'webpack/hot/only-dev-server',
    './scripts/index'
  ],
  output: {
    path: path.join(__dirname, 'build'),
    filename: 'scripts/bundle.js',
    publicPath: '/scripts/'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin(),
    new ExtractTextPlugin('styles/styles.css', {
      publicPath: '/styles/',
      allChunks: true
    })
  ],
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  module: {
    loaders: [{
      test: /\.jsx?$/,
      loaders: ['react-hot', 'babel'],
      include: path.join(__dirname, 'scripts')
    },
    {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract('style-loader', 'css-loader')
    }]
  }
};

下面是html页面

<html>
  <head>
    <link rel="stylesheet" href="build/styles/styles.css">
  </head>
  <body>
    <div id='root'></div>
  </body>
  <script src="build/scripts/bundle.js"></script>
</html>

【讨论】:

  • 我想将 .svg 转换为字体文件,谁能帮帮我
  • @Rohitesh -> 将 svg 上传到 icomoon.io/app 它将为图标生成带有 css 的字体。
【解决方案3】:

使用css-loaderstyle-loader一起首先解析你的CSS,然后把它变成样式节点,可以像代码一样导入Webpack。我不明白你为什么要在 JavaScript 和 CSS 之间建立这种人为的关系。

上述方法最后再次发出 CSS。为什么要让你的代码经历这样的往返旅程?使用raw-loader 并将您的主 CSS 文件添加到您的入口点。您会丢失 css-loader 执行的任何错误检查,但您的编译速度会更快。但如果你使用sass-loader 之类的东西,你仍然会得到所有的错误检查。

【讨论】:

    【解决方案4】:

    这是一个有效的 webpack.config.js。我不使用与您相同的目录名称,但我认为您可以看到差异并进行所需的更改。我还包括我当前的模块版本。

    const path = require('path');
    const ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    const config = {
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'build'),
        filename: 'bundle.js',
        publicPath: 'build/'
      },
      module: {
        rules: [
          {
            use: 'babel-loader',
            test: /\.js$/
          },
          {
            loader: ExtractTextPlugin.extract({fallback: 'style-loader', use: 'css-loader'}),
            test: /\.css$/
          },
          {
            test: /\.(jpe?g|png|gif|svg)$/,
            use: [
              {
                loader: 'url-loader',
                options: { limit: 40000 }
              },
              'image-webpack-loader?bypassOnDebug'
            ]
          }
        ]
      },
      plugins: [
        new ExtractTextPlugin({filename: 'style.css',
          allChunks: true
        })
      ]
    };
    
    module.exports = config;
    

    // 和模块:

    "devDependencies": {
        "babel-core": "^6.24.1",
        "babel-loader": "^6.4.1",
        "babel-preset-env": "^1.3.3",
        "css-loader": "^0.28.0",
        "extract-text-webpack-plugin": "^2.0.0-beta.4",
        "file-loader": "^0.11.1",
        "image-webpack-loader": "^3.3.0",
        "style-loader": "^0.16.1",
        "url-loader": "^0.5.8",
        "webpack": "^2.2.0-rc.0"
      }
    

    【讨论】:

      猜你喜欢
      • 2018-05-25
      • 2017-06-09
      • 2018-07-11
      • 2017-07-16
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 2016-09-22
      • 2018-07-01
      相关资源
      最近更新 更多