Thứ tự trình tải cho webpack là gì?


86

Khi tôi có cấu hình trình tải với nhiều thử nghiệm khớp với một tệp, tôi chỉ mong đợi trình tải phù hợp đầu tiên được sử dụng nhưng dường như không phải vậy.

Tôi đã thử đọc mã nguồn nhưng ngay cả khi tôi tìm thấy bit mà tôi nghĩ rằng thực hiện tải, tôi không thể hiểu nó hoạt động như thế nào.

Tài liệu cũng không đề cập đến tình huống đó sẽ hoạt động như thế nào.

Câu trả lời:


108
{
    test: /\.css$/,
    loaders: ['style'],
},
{
    test: /\.css$/,
    loaders: ['css'],
},

{
    test: /\.css$/,
    loaders: ['style', 'css'],
},

dường như ngang nhau. Về chức năng, điều này giống như style(css(file))(cảm ơn Miguel).

Lưu ý rằng bên trong loaderschúng được đánh giá từ phải sang trái .


2
Hmm, không hành vi rất hữu ích Tôi nghĩ: - / Tôi thà sử dụng Preloaders hành vi đó ...
w00t

19
Bộ tải hoạt động giống như các chức năng, đó là lý do tại sao nó từ phải sang trái. Khi bạn sử dụng điều này "style!css", hãy tưởng tượng chúng giống như các hàm: style( css( file ) )... trong trường hợp cssnày được gọi đầu tiên.
Miguel Angelo

11
Đánh giá từ PHẢI sang TRÁI khiến tôi phải vật lộn một lúc. @ miguel-angelo style( css( file ) )lời giải thích của bạn làm tôi nhẹ nhõm hơn.
Evi Song

1
Phải sang trái rất có thể cơ bản có nghĩa dưới lên trên, khi chúng tôi đang xem xét Webpack 3 Cú pháp ... nhất dưới như sau: đầu tiên aka trong cùng chức năng ...
Frank Nocke

1
Tôi không biết điều này được thêm vào khi nào nhưng cuối cùng cũng có tài liệu về thứ tự: webpack.js.org/concept/loaders/#loader-features Có thể xâu chuỗi các máy tải. Mỗi bộ tải trong chuỗi áp dụng các phép biến đổi cho tài nguyên được xử lý. Một chuỗi được thực hiện theo thứ tự ngược lại. Bộ tải đầu tiên chuyển kết quả của nó (tài nguyên với các phép biến đổi được áp dụng) cho cái tiếp theo, v.v. Cuối cùng, webpack hy vọng JavaScript sẽ được trả về bởi trình tải cuối cùng trong chuỗi.
Eric Majerus

61

Tài liệu chính thức giải thích nó thực sự tốt. Thật không may, tất cả các thông tin cần thiết đều nằm trong các phần khác nhau của tài liệu. Hãy để tôi tóm tắt tất cả những gì bạn cần biết.

1.

Đảm bảo rằng chúng theo đúng thứ tự (từ dưới lên trên).

2.

Chúng là các hàm lấy nguồn của một tệp tài nguyên làm tham số và trả về nguồn mới.

3.

Máy xúc lật có thể bị xích. Chúng được áp dụng trong một đường dẫn đến tài nguyên. Trình tải cuối cùng dự kiến ​​sẽ trả về JavaScript; mỗi bộ tải khác có thể trả về nguồn ở định dạng tùy ý, được chuyển cho bộ tải tiếp theo.

Vì thế...

Nếu bạn có somefile.cssvà bạn đang đi qua nó qua loaderOne, loaderTwo, loaderThreelà cư xử như một hàm xích thông thường.

{
    test: /\.css$/,
    loaders: ['loaderOne', 'loaderTwo', 'loaderThree']
}

có nghĩa là hoàn toàn giống với ...

loaderOne(loaderTwo(loaderThree(somefile.css)))

Nếu bạn đến từ grunt || thế giới nuốt nó là khó hiểu. Chỉ cần đọc thứ tự bộ tải từ phải sang trái.


1
Tôi có mảng module.loader này, chúng thực thi theo thứ tự nào?
Saras Arya

44
TẠI SAO HỌ TẢI ĐÁY LÊN ĐẦU! ??
light24bulbs

bạn có thể muốn sửa đổi câu trả lời để chỉ định rằng "trình tải cuối cùng" trong tài liệu nằm loaderOnetrong ví dụ của bạn
aaaaaa

1
@ light24bulbs để bạn có thể thêm các bộ nạp bổ sung với .pushquy tắc đơn giản và không phải lo lắng về việc thêm chúng.
Sarke

2

Câu trả lời này hữu ích đối với tôi nhưng tôi muốn bổ sung bằng một điểm khác ảnh hưởng đến thứ tự bộ tải, đó là tên bộ tải! tiếp cận.

Giả sử bạn có một url-loadertrong cấu hình của mình với mức độ ưu tiên cao hơn file-loadervà bạn muốn nhập đường dẫn hình ảnh với đường dẫn sau. Không làm gì sẽ nhập tệp qua url-loader(tạo ra một url dữ liệu được mã hóa).

Đặt tiền tố nhập với file-loader!sẽ chuyển trực tiếp quá trình nhập tới trình nạp đó.

import image from 'file-loader!./my-img.png'

3
Có, mặc dù tôi muốn tránh điều đó vì lúc đó bạn không thể quyết định xem tệp nên là một liên kết hay được nhúng. Bạn cũng có thể bắt đầu với !!việc bỏ qua bất kỳ trình tải nào khác BTW…
w00t
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.