Webpack style-loader เทียบกับ css-loader


238

ฉันมีสองคำถาม

1) CSS LoaderและStyle Loaderเป็นสอง webpack loader ฉันไม่เข้าใจความแตกต่างระหว่างสองคนนี้ ทำไมฉันถึงต้องใช้สองโฮเมื่อพวกเขาทั้งสองทำงานเดียวกัน?

2) .useable.less และ .useable.css นี้ที่กล่าวถึงในไฟล์ Readme.md ข้างต้นคืออะไร


คำตอบ:


283

ตัวโหลด CSS ใช้ไฟล์ CSS และส่งคืน CSS พร้อมimportsและurl(...)แก้ไขผ่านการrequireทำงานของ webpack :

var css = require("css!./file.css");
// => returns css code from file.css, resolves imports and url(...) 

จริงๆแล้วมันไม่ได้ทำอะไรกับ CSS ที่ส่งคืน

ตัวโหลดสไตล์ใช้ CSS และแทรกลงในเพจเพื่อให้สไตล์นั้นแอ็คทีฟบนหน้า

พวกเขาทำการดำเนินการที่แตกต่างกัน แต่มักจะมีประโยชน์ในการโยงเข้าด้วยกันเช่นท่อ Unix ตัวอย่างเช่นหากคุณใช้ตัวประมวลผลล่วงหน้า CSS น้อยคุณสามารถใช้

require("style!css!less!./file.less")

ถึง

  1. เปลี่ยนfile.lessเป็น CSS ธรรมดาด้วยตัวโหลดน้อย
  2. แก้ไขทั้งหมดimportsและurl(...)s ใน CSS ด้วย CSS โหลดเดอร์
  3. แทรกสไตล์เหล่านั้นลงในหน้าด้วยตัวโหลดสไตล์

24
คุณช่วยบอกได้ไหมว่าคุณใส่อะไรลงไปบ้างในหน้า? เนื่องจากฉันใช้ ExtractTextPlugin สำหรับ CSS และตามสิ่งที่คุณเขียนฉันไม่ควรใช้ตัวโหลดสไตล์ นอกจากนี้สิ่งที่ฉันรู้สึกคือการใช้สไตล์โหลดเดอร์ทำให้สไตล์ของฉันได้รับการรวมกับ JS จนกว่าฉันจะใช้ปลั๊กอินแยก หมายเหตุ: ฉันใช้ webpack และหลังจากออกว่ารูปแบบ-loader สิ่งที่มีการเปลี่ยนแปลงสำหรับฉันเป็นเพราะฉันเพิ่งบอกข้างต้นว่าผมแล้วมี CSS ของฉันในการแยกไฟล์ที่สร้างขึ้นโดยปลั๊กอินสารสกัด ..
myDoggyWritesCode

6
@ user3241111 ฉันคิดว่าเขาหมายถึงสิ่งนี้: "เพิ่ม CSS ใน DOM โดยการฉีด<style>แท็ก" (นี่จะถูกคัดลอกมาจากเอกสารอย่างเป็นทางการที่github.com/webpack/style-loader )
exmaxx

1
ดังนั้นแนวคิดก็คือ webpack จะรวม CSS ที่ได้รับการประมวลผลทั้งหมดของคุณและวางไว้ในส่วนหัวของเอกสารเพื่อหลีกเลี่ยงการร้องขอ HTTP สำหรับแท็ก <link> และนิยามสไตล์ URL ฉันคิดว่านี่เป็นประเด็น สิ่งที่ชอบเย้ายวนใจและมีเสน่ห์ทำเช่นนี้เช่นกัน ฉันค่อนข้างแน่ใจว่ามันจะโหลดเร็วกว่านี้ แต่ฉันอาจไม่ถูกต้อง
ต.ค.

โดยimportsฉันถือว่าคุณอ้างถึง@importคำสั่ง โดยค่าเริ่มต้นคำสั่งนี้ไม่รวมกฎ CSS ที่นำเข้ามาในตัวนำเข้า แต่สร้างGETคำขออื่น คุณกำลังบอกว่าcss-loaderจะส่งคืนผลลัพธ์ที่ถูกผสาน?
adi518


55

css-loaderอ่านในไฟล์ css เป็นสตริง คุณสามารถแทนที่ด้วยraw-loaderและรับผลเช่นเดียวกันในสถานการณ์จำนวนมาก เนื่องจากมันเพิ่งอ่านเนื้อหาไฟล์และไม่มีอะไรอื่นมันไม่มีประโยชน์อะไรเลยนอกจากคุณจะโยงมันด้วยตัวโหลดอื่น

style-loaderใช้สไตล์เหล่านั้นและสร้าง<style>แท็กใน<head>องค์ประกอบของหน้าเว็บที่มีสไตล์เหล่านั้น

หากคุณดูจาวาสคริปต์ภายในbundle.jsหลังจากใช้งานstyle-loaderคุณจะเห็นความคิดเห็นในรหัสที่สร้างขึ้นซึ่งระบุว่า

// style-loader: เพิ่ม css ไปยัง DOM โดยเพิ่มแท็ก

ตัวอย่างเช่น,

<html>
    <head>
        <!-- this tag was created by style-loader -->
        <style type="text/css">
            body {
                background: yellow;
            }
        </style>
    </head>
    <body>
        <script type="text/javascript" src="bundle.js" charset="utf-8"></script>
    </body>
</html>

ตัวอย่างนั้นมาจากบทช่วยสอนนี้ หากคุณลบออกstyle-loaderจากไปป์ไลน์โดยการเปลี่ยนบรรทัด

require("!style-loader!css-loader!./style.css");

ถึง

require("css-loader!./style.css");

คุณจะเห็นว่าสิ่งที่<style>หายไป


5
ดังนั้นเมื่อผมควรใช้css-loaderเมื่อเทียบกับraw-loader?
Royi Namir

4
css-loader ตีความ @import และ url () เช่น import / require () และจะแก้ปัญหาเหล่านั้น raw-loader โหลดไฟล์ที่ระบุเท่านั้น
แอนดรู

13

ในการตอบคำถามที่สอง "สิ่งนี้คือ. use.less และ. useable.css ที่กล่าวถึงในไฟล์ Readme.md ข้างต้น?" โดยค่าเริ่มต้นเมื่อสไตล์คือrequire'dโมดูล style-loader จะแทรก<script>แท็กลงใน DOM โดยอัตโนมัติและ แท็กนั้นยังคงอยู่ใน DOM จนกว่าหน้าต่างเบราว์เซอร์จะปิดหรือโหลดซ้ำ โมดูลโหลดเดอร์สไตล์ยังมี "API อ้างอิงนับ" ที่ช่วยให้นักพัฒนาสามารถเพิ่มสไตล์และลบออกในภายหลังเมื่อไม่ต้องการใช้อีกต่อไป API ทำงานดังนี้:

const style = require('style/loader!css!./style.css')
// The "reference counter" for this style starts at 0
// The style has not yet been injected into the DOM
style.use()  // increments counter to 1, injects a <style> tag
style.use()  // increments counter to 2
style.unuse()  // decrements counter to 1
style.unuse()  // decrements counter to 0, removes the <style> tag

ตามแบบแผนสไตล์ชีตที่โหลดโดยใช้ API นี้มีส่วนขยาย ".able.css" มากกว่า ".css" เพียงอย่างเดียว


คำตอบนี้ไม่เกี่ยวกับการกำหนดค่า Webpack
Andrew Koster

@AndrewKoster ฉันไม่เข้าใจว่าคุณหมายถึงอะไร นี่เป็นคำตอบของคำถามที่สองของโปสเตอร์ต้นฉบับเกี่ยวกับการทำงานภายในและการตั้งชื่อไฟล์ของโมดูลตัวโหลดสไตล์
chrisarnesen

แน่นอน แต่อย่างที่คุณพูดมีสองคำถาม คำตอบนี้ (และคำตอบที่ยอมรับ) ไม่สนใจส่วนแรกของคำถามซึ่งเป็นส่วนที่สำคัญกว่า คำตอบเดียวที่ตอบคำถามของตัวโหลดเหล่านี้คืออะไรและวิธีกำหนดค่าเหล่านี้คือคำตอบของ Brian Ogden ที่ไม่มีใครลงคะแนนให้ (ด้วยเหตุผลบางอย่าง)
Andrew Koster

ฉันไม่ได้ใช้สิ่งแปลก ๆ นี้ต้องใช้ไวยากรณ์กับเครื่องหมายอัศเจรีย์บ้า แต่ฉันยังต้องรู้วิธีกำหนดค่าตัวตักเหล่านี้ใน Webpack กรณีการใช้งานของฉันดูเหมือนจะเป็นเรื่องธรรมดามากกว่าสิ่งที่คุณทุกคนกำลังทำอยู่กับความบ้าต้องใช้ไวยากรณ์
Andrew Koster

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.