lỗi cửa sổ không được xác định khi sử dụng React extract-text-webpack-plugin


82

Tôi đang sử dụng webpack để xây dựng các thành phần phản ứng của mình và tôi đang cố gắng sử dụng extract-text-webpack-pluginđể tách css của tôi khỏi tệp js đã tạo của tôi. Tuy nhiên, khi tôi cố gắng để xây dựng các thành phần tôi nhận được lỗi sau: Module build failed: ReferenceError: window is not defined.

Tệp webpack.config.js của tôi trông giống như sau:

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

module.exports = {
  entry: {
    MainComponent: './src/main.js'
  },
  output: {
    libraryTarget: 'var',
    library: 'MainComponent',
    path: './build',
    filename: '[name].js'
  },
  module: {
    loaders: [{
      test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader!css-loader')
    }]
  },
  plugins: [
    new ExtractTextPlugin('styles.css')
  ]
}

5
tôi đã tìm ra câu trả lời. thay vì ExtractTextPlugin.extract('style-loader!css-loader')bạn phải viếtExtractTextPlugin.extract('style-loader', 'css-loader')
ganonside

3
Bạn có thể chuyển câu trả lời đó thành một câu trả lời và đánh dấu vấn đề đã được giải quyết không? Cảm ơn.
Juho Vepsäläinen

Tôi vừa làm. Xin lỗi vì điều đó.
ganonside

Câu trả lời:


59

Bạn có thể muốn sử dụng style-loaderlàm befoređối số trong extracthàm.

Đây là cách triển khai gốc:

    ExtractTextPlugin.extract = function(before, loader, options) {
        if(typeof loader === "string") {
            return [
                ExtractTextPlugin.loader(mergeOptions({omit: before.split("!").length, extract: true, remove: true}, options)),
                before,
                loader
            ].join("!");
        } else {
            options = loader;
            loader = before;
            return [
                ExtractTextPlugin.loader(mergeOptions({remove: true}, options)),
                loader
            ].join("!");
        }
    };

Vì vậy, cơ bản những gì bạn cần làm là:

{
    test: /\.sass$/,
    exclude: /node_modules/,
    loader: ExtractTextPlugin.extract('style-loader', 'css!sass?indentedSyntax=true&sourceMap=true')
},

nếu bạn sử dụng ví dụ sass.


Điều này đã giải quyết cho tôi khi làm việc với Stylus. Cảm ơn @squixy!
Gabriel Godoy

1
Nếu bạn đang gặp vấn đề với SCSS không sass, sau đó loại bỏ các indentedSyntax = true
Robert Leggett

43

Không thấy giải thích nguyên nhân nên mình đăng câu trả lời này lên đây.

Từ https://github.com/webpack/extract-text-webpack-plugin#api

ExtractTextPlugin.extract([notExtractLoader], loader, [options]) Tạo trình tải giải nén từ trình tải hiện có.

notExtractLoader (tùy chọn) (các) trình tải sẽ được sử dụng khi css không được trích xuất (tức là trong một> đoạn bổ sung khi allChunks: false)

loader (các) bộ tải sẽ được sử dụng để chuyển đổi tài nguyên thành mô-đun xuất css.

options

publicPath ghi đè cài đặt publicPath cho trình tải này.

Các #extractphương pháp sẽ nhận được một bộ nạp đầu ra mà css. Điều đã xảy ra là nó đang nhận được một style-loader xuất ra mã javascript , này được dự định đưa vào một trang web. Mã này sẽ cố gắng truy cập window.

Bạn không nên chuyển một chuỗi trình tải với styletới #extract. Tuy nhiên ... nếu bạn đặt allChunks=false, thì nó sẽ không tạo tệp CSS cho các phần không phải ban đầu. Do đó, nó cần phải biết bộ tải cần sử dụng để đưa vào trang.

Mẹo: Webpack là một công cụ thực sự cần được hiểu chuyên sâu nếu không bạn có thể gặp phải rất nhiều vấn đề lạ.


Những điều tốt nhất tôi từng nghe về webpack.
Jide

xin lỗi về việc không có lời giải thích trong câu trả lời của tôi. Các tài liệu webpack vẫn đang được viết (và có thể vẫn còn) vào thời điểm tôi đăng câu hỏi và câu trả lời. Nhưng tôi đồng ý rằng nó cần phải được hiểu khá rõ.
ganonside

1
Nội dung chất lượng cao ở đây. Nếu tài liệu tốt bằng một nửa, tôi sẽ là một lập trình viên thực sự hạnh phúc.
Rocío García Luque

20

Webpack 2

Nếu bạn đang sử dụng Webpack 2, biến thể này hoạt động:

    rules: [{
        test: /\.css$/,
        exclude: '/node_modules/',
        use: ExtractTextPlugin.extract({
            fallback: [{
                loader: 'style-loader',
            }],
            use: [{
                loader: 'css-loader',
                options: {
                    modules: true,
                    localIdentName: '[name]__[local]--[hash:base64:5]',
                },
            }, {
                loader: 'postcss-loader',
            }],
        }),
    }]

Phương pháp trích xuất mới không còn nhận ba đối số và được liệt kê là một thay đổi đột phá khi chuyển từ V1 sang V2.

https://webpack.js.org/guides/migrating/#extracttextwebpackplugin-break-change


12

Tôi đã tìm ra giải pháp cho vấn đề của mình:

Thay vì nối các bộ nạp vào nhau ( ExtractTextPlugin.extract('style-loader!css-loader')), bạn phải chuyển mỗi bộ nạp dưới dạng một tham số riêng biệt:ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')


8
Khá chắc chắn đây là điều mà @squixy đã nói sẽ làm 5 tháng trước.
cchamberlain

3
Câu lệnh "mỗi bộ nạp là một tham số riêng biệt" chỉ đúng với hai bộ nạp và sai cho ba bộ nạp trở lên. Các extractchức năng có ba thông số: (before, loader, options), và câu trả lời này cover mà hoàn hảo: stackoverflow.com/a/30982133/1346510
sompylasar

1
@sompylasar cảm ơn bạn rất nhiều vì nhận xét này. Nó đã giải quyết vấn đề của tôi! Tôi giả định rằng tất cả các tham số được chuyển vào sẽ chỉ được lặp lại trực tiếp. Rất vui khi nói rằng nếu bạn cần sử dụng 'style', 'css', 'sass'thì bạn chỉ cần thay đổi nó thành 'style', 'css!sass'- Cảm ơn!
Aleski

3
ĐIỀU NÀY SAI hãy đọc các bình luận hoặc câu trả lời ở trên. Viết đậm điều này vì ai đó sẽ đọc câu trả lời này và không hiểu tại sao ExtractTextPlugin không sử dụng tất cả các trình tải của họ.
Don P

Các câu trả lời khác dường như hiệu quả với những người khác nhưng khi tôi đăng câu hỏi thì đây là câu trả lời hiệu quả cho tôi nên tôi đã đánh dấu nó.
ganonside
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.