使用 Webpack 2 和 extract-text-webpack-plugin

Posted

技术标签:

【中文标题】使用 Webpack 2 和 extract-text-webpack-plugin【英文标题】:Using Webpack 2 and extract-text-webpack-plugin 【发布时间】:2017-07-11 15:15:29 【问题描述】:

我将 extract-text-webpack-plugin 2.0.0-rc.3 与 Webpack 2.2.1 一起使用,并且在运行构建时遇到此错误:

/node_modules/extract-text-webpack-plugin/index.js:259
var shouldExtract = !!(options.allChunks || chunk.isInitial());
                                                  ^
TypeError: chunk.isInitial is not a function

这是我的 webpack.config.js:

'use strict';
const argv = require('yargs').argv;
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const webpack = require('webpack');

module.exports = (function () 
  let config = 
    entry   : './' + process.env.npm_package_config_paths_source + '/main.js',
    output  : 
      filename : 'main.js'
    ,
    watch   : !!argv.watch,
    vue     : 
      loaders : 
        js   : 'babel-loader',
        // Create separate CSS file to prevent unstyled content
        sass : ExtractTextPlugin.extract("css!sass?sourceMap") // requires `devtool: "#source-map"`
      
    ,
    module  : 
      rules : [
        
          test    : /\.js$/,
          use     : 'babel-loader',
          exclude : '/node_modules/'
        ,
        
          test    : /\.vue$/,
          use     : 'vue-loader',
          options : 
            loaders : 
              'scss' : 'vue-style-loader!css-loader!sass-loader',
              'sass' : 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
            ,
          
        
      ]
    ,
    plugins : [
      new webpack.DefinePlugin(
        'process.env' : 
          npm_package_config_paths_source : '"' + process.env.npm_package_config_paths_source + '"'
        
      ),
      new ExtractTextPlugin("style.css")
    ],
    resolve : 
      alias : 
        'vue$' : 'vue/dist/vue.common.js'
      
    ,
    babel   : 
      "presets"  : ["es2015", "stage-2"],
      "comments" : false,
      "env"      : 
        "test" : 
          "plugins" : ["istanbul"]
        
      
    ,
    devtool : "#source-map" // #eval-source-map is faster but not compatible with ExtractTextPlugin
  ;

  if (process.env.NODE_ENV === 'production') 
    config.plugins = [
      // short-circuits all Vue.js warning code
      new webpack.DefinePlugin(
        'process.env' : 
          NODE_ENV                        : '"production"',
          npm_package_config_paths_source : '"' + process.env.npm_package_config_paths_source + '"'
        
      ),
      // minify with dead-code elimination
      new webpack.optimize.UglifyJsPlugin(),
      new ExtractTextPlugin("style.css")
    ];
    config.devtool = "#source-map";
  

  return config;
)();

当我从 plugins 数组中删除 new ExtractTextPlugin("style.css") 时,构建运行正常,但不会创建 style.css

如果我添加 allChunks: true 选项,错误会变成这样:

/node_modules/webpack/lib/Chunk.js:80
return this.entrypoints.length > 0;
                       ^
TypeError: Cannot read property 'length' of undefined

【问题讨论】:

我也面临同样的问题 下面发布的答案也可能对您有所帮助@EnugulaS 【参考方案1】:

如果您在 .vue 文件或单独的 .scss 文件中编写样式规则,使用以下 webpack 配置可以实现您要搜索的内容:

webpack.confi.js:

var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
        ....
        ....
module.exports = 
      ....
      ....
      module: 
          rules: [
            
                test: /\.vue$/,
                loader: 'vue-loader',
                options: 
                  loaders: 
                    'scss': ExtractTextPlugin.extract('css-loader!sass-loader'),
                    'sass': ExtractTextPlugin.extract('css-loader!sass-loader?indentedSyntax')
                  
                
             ,
              ....
              ....
              
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract('css-loader!sass-loader')
              
              ....
              ....
          ] // rules end
      , // module end
      plugins: [
          new ExtractTextPlugin('style.css')
      ],
      ....
  

只要确保你已经通过 NPM 安装了这些模块/加载器:

css 加载器 sass 加载器 节点-sass extract-text-webpack-plugin

【讨论】:

以上是关于使用 Webpack 2 和 extract-text-webpack-plugin的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Webpack 2.2.0 和 webpack-dev-server 2.2.1 进行 HMR(热模块替换)css/scss

使用 React 和 Webpack 设置 Airbnb ESLint

使用 Webpack 2 和 React Router 进行 CSS 代码拆分

初始webpack

我啥时候在 Webpack 2 module.rules 中使用“use”和“loader”?

技术 | webpack 2 使用总结