Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. PostCSS
Webdesign

Sử dụng PostCSS cùng với Sass, Stylus hoặc LESS

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called PostCSS Deep Dive.
PostCSS Deep Dive: Roll Your Own Preprocessor
Using PostCSS with BEM and SUIT Methodologies

Vietnamese (Tiếng Việt) translation by Thai An (you can also view the original English article)

Nếu bạn hứng thú sử dụng PostCSS, nhưng bạn vẫn yêu thích preprocessor (bộ tiền xử lý) yêu thích của mình, đừng lo lắng. Bạn không cần phải lựa chọn giữa hai thứ - bạn có thể sử dụng chúng cùng nhau.

Có một số plugin PostCSS bổ sung cho preprocessor rất tốt, khi chúng bổ sung chức năng vào quy trình làm việc của bạn mà sẽ bất khả khi hoặc khó khăn hơn khi chỉ dùng một preprocessor.

Chúng tôi sẽ đề cấp đến vài plugin miễn phí, sau đó chúng ta sẽ hướng dẫn thiết lập để cho bạn thấy cách sử dụng PostCSS cùng chung với Sass, Stylus hoặc LESS.

Tại sao nên sử dụng cả hai?

Trước khi chúng ta tìm hiểu cách bạn có thể sử dụng các preprocessor cùng với PostCSS, chúng ta sẽ nói một chút về lý do bạn muốn dùng nói. Câu trả lời ngắn gọn: để truy cập vào các plugin PostCSS có chức năng bổ sung các preprocessor. Để cho bạn thấy lý do tại sao những điều này đáng giá, chúng ta sẽ xem xét một số plugin thực sự hoạt động tốt với các preprocessor.

Lưu ý: có thể đạt được kết quả cuối cùng tương tự bằng cách sử dụng mixin và hàm trong code của preprocessor thông thường, nhưng với mỗi ví dụ bên dưới, quy trình được tự động xử lý. Bạn viết CSS của bạn bình thường và các plugin quản lý mọi thứ cho bạn, không có hàm để gọi, không kèm mixins, hoặc không có đối số được truyền vào.

autoprefixer

Đã có nhiều preprocessor mixin được viết để xử lý việc chèn prefix của các vendor. Ví dụ: bạn có thể đã sử dụng @include box-sizing (border-box); từ thư viện Compass để xuất ra các quy tắc box-sizing của vendor.

Rắc rối với việc dựa vào mixins của prefix từ vendor là:

  1. Trước tiên, bạn phải biết về một thuộc tính cần có prefix trước khi bạn có thể quyết định triển khai mixin cho nó.
  2. Bạn phải biết tên của mixin liên quan và cách sử dụng nó.
  3. Bạn phải duy trì các tab khi prefix của nhà cung cấp không còn cần thiết cho mỗi thuộc tính (tôi biết tôi đã prefix box-sizing theo cách dài dòng...)

Autoprefixer loại bỏ những mối quan tâm này bằng cách xử lý quá trình tự động tạo prefix của vendor. Autoprefixer quét CSS của bạn, kiểm tra nó với dữ liệu từ CanIUse.com, sau đó thêm các prefix được yêu cầu.

Đọc thêm về Autoprefixer tại: https://github.com/postcss/autoprefixer

rtlcss

Việc tạo cả hai stylesheet RTL (từ phải sang trái) và mặc định từ một nguồn riêng lẻ cũng đã được thực hiện với các preprocessor, tuy nhiên nó thường yêu cầu sử dụng một số mixin và/hoặc biến nội suy vào mã của bạn ở một vài nơi. Ví dụ, thay vì viết margin-left:1rem; bạn có thể cần phải viết margin-#{dir}: 1rem; hoặc @include margin-left( 1rem );.

Tuy nhiên, với plugin rtlcss của Mohammad Younes, bạn không cần sử dụng mixin hoặc nội suy biến, bạn chỉ cần viết stylesheet như bình thường và plugin sẽ tìm tất cả các giá trị hoặc “right” hoặc “left” và hoán đổi chúng. Vì vậy, margin-left: 1rem; tự động trở thành margin-right:1rem; mà không cần phải viết bất kỳ mã đặc biệt nào để thực hiện điều này.

Đọc thêm về rtlcss tại: https://github.com/MohammadYounes/rtlcss

postcss-colorblind

Với plugin postcss-colorblind của Brian Holt, bạn có thể tự động tạo ra các phiên bản khác nhau của stylesheet để mang đến cho bạn trải nghiệm trực tiếp về thiết kế của bạn đối với người bị mù màu. Nó có thể mô phỏng tám kiểu mù màu khác nhau, giúp bạn có cơ sở vững chắc về việc mức độ truy xuất các màu của bạn.

Đây là một ví dụ về chức năng mà bạn thực sự phải đi đến PostCSS để tìm, vì nó sẽ rất khó khăn cho các preprocessor thực hiện.

Đọc thêm về postcss-colorblind tại: https://github.com/btholt/postcss-colorblind

postcss-svgo

Plugin postcss-svgo của Ben Briggs có thể cho phép bạn tự do tối ưu của inline code SVG. Ví dụ:

Điều quan trọng nhất là code ít hơn một nửa.

Đọc thêm về postcss-svgo tại: https://github.com/ben-eb/postcss-svgo

cssnano

Trong khi các preprocessor có thể loại bỏ whitespace (khoảng trắng) và comment (nhận xét), package cssnano của Ben Briggs có thể triển khai tất cả các kiểu tối ưu hóa ở trên và hơn cả hai bước này. Chúng tôi trình bày chi tiết về cssnano trong bài hướng dẫn For Minification and Optimization.

Đọc thêm về cssnano tại: https://github.com/ben-eb/cssnano

postcss-font-magician

Plugin postcss-font-magician của Jonathan Neal giúp thêm font tùy chỉnh dễ dàng như sử dụng font thông thường. Bạn không cần sử dụng bất kỳ mixin nào, chỉ cần thêm font-family như bạn thường làm:

... và plugin sẽ xử lý toàn @font-face cho bạn:

Đọc thêm về postcss-font-magician tại: https://github.com/jonathantneal/postcss-font-magician

Thiết lập dự án

Có 6 hướng dẫn cài đặt bên dưới: hướng dẫn về Gulp và Grunt cho mỗi preprocessor lớn. Không cần phải đọc tất cả sáu, bạn chỉ có thể chuyển thẳng đến hướng dẫn cho build tool và preprocessor yêu thích của bạn. Nếu bạn không chắc chắn sẽ sử dụng Gulp hay Grunt, Gulp chắc chắn là sự lựa chọn đơn giản cho hướng dẫn này.

Đối với bất kỳ hướng dẫn nào bạn theo dõi, bạn sẽ cần phải bắt đầu với một dự án Gulp hoặc Grunt mới. Bạn có thể đọc về cách thiết lập các dự án Gulp hoặc Grunt cho PostCSS trong các hướng dẫn trước

tương ứng.

Nếu bạn không muốn thiết lập thủ công dự án của mình từ đầu, bạn có thể tải xuống các file nguồn được đính kèm với hướng dẫn này và trích xuất dự án khởi động Gulp hoặc Grunt được cung cấp vào thư mục dự án mới. Sau đó, ở thư mục của terminal hoặc command prompt, chạy lệnh npm install.

Cài đặt PostCSS Plugins vào dự án của bạn

Sau khi bạn thiết lập một dự án mới cho một trong các phần bên dưới, bạn cũng cần phải cài đặt hai plugin PostCSS: Autoprefixer và cssnano. Bạn có thể làm vậy bằng cách chạy lệnh:

Chúng tôi sẽ sử dụng hai plugin này để kiểm tra liệu PostCSS đó và preprocessor của bạn đang làm việc cùng nhau như mong đợi.

Xử lý trước PostCSS

Quy tắc đầu tiên của việc sử dụng một preprocessor với PostCSS là bạn nên luôn chạy preprocessor trước tiên. Lý do là vì bạn không bất kỳ cú pháp đặc trưng của preprocessor trong code của bạn làm đình trệ plugin PostCSS, và bạn cũng không muốn PostCSS thay đổi code của bạn, điều này có thể ngăn cản preprocessor hoạt động như ý bạn.

PlugCSS PostCSS và "PostCSS Test Code"

Đối với mỗi preprocessor được thiết lập, chúng ta sẽ yêu cầu chúng chạy autoprefixer và cssnano sau khi preprocessor đã hoàn thành quá trình biên dịch. Trong từng trường hợp, chúng ta sẽ cần phải thêm một số test code để 2 plugin này hoạt động.

Để lưu việc lặp lại cùng code trong từng phần bên dưới, khi bạn thấy hướng dẫn yêu cầu bạn thêm PostCSS test code của mình, vui lòng thêm code này vào file nguồn preprocessor mà bạn đang làm việc:

Nếu thành công, code được biên dịch của bạn sẽ trong mỗi trường hợp xuất hiện dưới dạng:

Lưu ý: việc sử dụng flexbox đã được autoprefix, và cssnano đã thực hiện tối ưu hóa code. Chúng tôi đang sử dụng cùng một mã để kiểm tra cssnano như chúng ta đã làm trong hướng dẫn For Minification and Optimization trước đây, vì vậy vui lòng tham khảo phần “cssnano” trong đó để biết chi tiết về việc tối ưu hóa được thực hiện.

1. Sass + PostCSS

Vì bạn đã làm việc với Node.js để chạy Gulp hoặc Grunt và PostCSS, cách dễ nhất để sử dụng Sass cùng với chúng là thông qua LibSass. Thư viện này cũng nhanh hơn đáng kể so với Ruby Sass. Chúng tôi sẽ triển khai LibSass thông qua các module gulp-sass hoặc grunt-contrib-sass.

Thiết lập thông qua Gulp

Cài đặt module gulp-sass vào dự án của bạn với npm install gulp-sass --save-dev.

Bây giờ bạn có thể cập nhật Gulpfile của bạn như sau:

Hãy chia nhỏ những gì chúng ta đã thay đổi từ Gulpfile starter mặc định:

  • Đã thêm các biến để tải gulp-sass, autoprefixercssnano
  • Đã thêm biến autoprefixercssnano vào array processors.
  • Đã chỉnh sửa tiện ích mở rộng file trên file nguồn mà chúng ta đang biên dịch thành “.scss” thay vì “.css”
  • Đã bổ sung dòng pipe() mới, .pipe(sass()..., để xử lý Sass, hãy chắc chắn chèn nó trước dòng xử lý PostCSS

Bây giờ chúng ta có thể chạy một số thử nghiệm để đảm bảo cả Sass và PostCSS đang biên dịch như mong đợi.

Kiểm tra preprocessor

Đổi tên file “src/style.css” hiện có của bạn thành “src/style.scss” và thêm test code sau vào nó:

Chạy gulp css và bạn sẽ thấy một file “style.css” mới xuất hiện trong thư mục “dest” của bạn với nội dung:

Kiểm tra PostCSS

Bây giờ, hãy thêm test code PostCSS đã cung cấp trước đó trong hướng dẫn này vào file “style.scss” của bạn.

Chạy lệnh gulp css của bạn và bạn sẽ thấy code chính xác xuất hiện trong file “dest/style.css” của bạn:

Thiết lập thông qua Grunt

Vào dự án Grunt mới của bạn, cài đặt module grunt-contrib-sass với npm install grunt-contrib-sass.

Sau đó, thêm hàm grunt.loadNpmTasks() vào bên dưới hàm hiện bạn đang có trong PostCSS:

Bây giờ bạn sẽ cần phải thiết lập một tác vụ mới để xử lý Sass. Sau dòng này:

...nhưng trước tác vụ postcs hiện có, hãy bổ sung code này:

Bây giờ chúng ta sẽ đăng ký một tác vụ sẽ chạy Sass và sau đó là PostCSS. Sau hàm grunt.loadNpmTasks() bạn vừa chèn vào, hãy thêm:

Kiểm tra preprocessor

Để kiểm tra thiết lập của bạn, hãy đổi tên file “src/style.css” hiện có của bạn thành “style.scss”. Thêm code Sass này vào:

Chạy lệnh grunt css và bạn sẽ thấy một file mới được tạo trong thư mục “dest” của bạn có tên “style.css” và chứa mã này:

Thiết lập PostCSS

Bây giờ chúng ta sẽ chạy plugin Autoprefixer và cssnano của chúng ta. Cập nhật processors của Gruntfile thành mảng sau:

Kiểm tra PostCSS

Thêm code kiểm tra PostCSS vào file “style.scss” của bạn, chạy lệnh grunt css lần nữa và bạn sẽ thấy file “dest/style.css” được biên dịch lại của bạn, bây giờ chứa code tự được thêm prefix và được tối ưu hóa chính xác.

2. Stylus + PostCSS

Stylus và PostCSS làm việc đặc biệt tốt với nhau nhờ vào package PostStylus của Sean King, kết hợp việc xử lý cả Stylus và PostCSS. Nếu bạn là nhà phát triển Stylus, bạn chỉ có thể bổ sung PostStylus vào quy trình biên dịch của mình và ngay lập tức có quyền truy cập bằng cách sử dụng các plugin PostCSS thành một phần của quy trình làm việc của bạn.

PostStylus: https://github.com/seaneking/poststylus

Thiết lập thông qua Gulp

Nếu bạn đang sử dụng Gulpfile được tạo sẵn từ dự án khởi động, bạn sẽ lưu ý là sử dụng plugin gulp-postcss. Điều này thực sự chỉ có khi cần thiết cho quá trình thiết lập Sass và LESS, nhưng đối với Stylus, chúng ta sẽ không cần nó vì chúng ta đang sử dụng PostStylus làm trình biên dịch.

Bạn có thể gỡ bỏ nó khỏi dự án của bạn với npm uninstall gulp-postcss --save-dev, và xóa dòng này khỏi Gulpfile của bạn:

Bây giờ chúng ta có thể cài đặt hai plugin chúng ta cần cho việc biên dịch Stylus và PostCSS, bằng cách chạy lệnh:

Cập nhật Gulpfile của bạn:

Dưới đây là những gì chúng ta đã thực hiện ở trên:

  • Đã thêm các biến để tải gulp-stylus, poststylus, autoprefixercssnano
  • Đã thêm biến autoprefixercssnano vào array processors.
  • Đã chỉnh sửa extension file trên file nguồn mà chúng ta đang biên dịch thành “.styl” thay vì “.css”
  • Đã xóa dòng .pipe() để đọc .pipe(postcss(processors))
  • Thay thế nó bằng .pipe(stylus({..., để thiết lập các module gulp-stylus và poststylus để xử lý biên dịch của chúng ta

Kiểm tra preprocessor.

Bây giờ chúng ta đã sẵn sàng để thử nghiệm phần biên dịch Trong thư mục “src” của bạn, đổi tên “style.css” thành “style.styl” và thêm code Stylus này:

Chạy lệnh gulp css và bạn sẽ thấy một file “style.css” xuất hiện trong thư mục “dest” của bạn với nội dung này:

Kiểm tra PostCSS

Bổ sung code kiểm tra PostCSS được cung cấp trước đó vào file “style.styl” của bạn, bảo đảm tab indent cho phần code, không phải khoảng trắng.

Biên dịch lại và kiểm tra xem bạn có kết quả thích hợp trong file "dest/style.css" của bạn hay không.

Thiết lập qua Grunt

Như với dự án Gulp cho Stylus, trình biên dịch mặc định PostCSS kèm với dự án khởi động là không cần thiết, chỉ tồn tại hoàn toàn cho các quá trình thiết lập của Sass và LESS. Bạn có thể gỡ bỏ nó khỏi dự án của bạn với npm uninstall grunt-postcss --save-dev.

Bây giờ chúng ta có thể cài đặt grunt-contrib-stylus và poststylus bằng lệnh:

Chúng tôi sẽ không còn sử dụng các post-grunt nữa, vì vậy hãy tìm dòng này:

Và thay thế bằng:

Do chúng ta không sử dụng các post-grunt, điều đó có nghĩa là chúng ta sẽ không còn cần postcss mà chúng ta đã xác định bên trong grunt.initConfig({...});. Xóa cấu hình tác vụ đó và thay thế bằng tác vụ stylus mới này:

Kiểm tra preprocessor

Bây giờ chúng ta đã sẵn sàng để thử nghiệm phần biên dịch. Trong thư mục “src” của bạn, đổi tên “style.css” thành “style.styl” và thêm code Stylus này:

Chạy lệnh grunt stylus và bạn sẽ thấy một file “style.css” xuất hiện trong thư mục “dest” của bạn với nội dung này:

Thiết lập PostCSS

Để thêm các plugin PostCSS của chúng ta vào quá trình biên dịch, trước tiên chúng ta cần bổ sung code này vào trên cùng của Gruntfile, phía trên dòng module.exports...:

Đây là nơi bạn sẽ tải bất kỳ plugin PostCSS nào bạn muốn sử dụng, thay vì trong một array processors như bạn sẽ dùng như các hướng dẫn khác.

Sau đó tìm đối tượng options bên trong tác vụ stylus và cập nhật nó thành các mục sau:

Điều này cho grunt-contrib-stylus biết để sử dụng poststylus trong quá trình biên dịch và các plugin của nó cùng với nó.

Kiểm tra PostCSS

Thêm “test code PostCSS” vào file “src/style.styl” của bạn, chạy grunt stylus và bạn sẽ thấy nội dung sau được ghi vào file “dest/style.css” của bạn:

3. LESS + PostCSS

Thiết lập thông qua Gulp

Cài đặt module gulp-less vào dự án của bạn với npm install gulp-less --save-dev.

Bây giờ bạn có thể cập nhật Gulpfile của bạn như sau:

Hãy chia nhỏ những gì chúng ta đã thay đổi từ Gulpfile mặc định ban đầu:

  • Đã thêm các biến để tải gulp-less, autoprefixercssnano
  • Đã thêm biến autoprefixercssnano vào array processors
  • Đã chỉnh sửa tiện ích mở rộng file trên file nguồn mà chúng ta đang biên dịch thành “.less” thay vì “.css”
  • Đã thêm .pipe (less()) để xử lý LESS, hãy chắc chắn đặt nó trước khi dòng xử lý PostCSS

Kiểm tra preprocessor

Bây giờ chúng ta có thể chạy một số thử nghiệm để đảm bảo cả LESS và PostCSS đều được biên dịch như mong đợi.

Đổi tên file “src/style.css” hiện có thành “src/style.less” và thêm test code sau vào nó:

Chạy gulp css và bạn sẽ thấy một file “style.css” mới xuất hiện trong thư mục “dest” của bạn với nội dung:

Kiểm tra PostCSS

Bây giờ, để file “style.less” của bạn thêm test code PostCSS được cung cấp trước đó trong hướng dẫn này.

Chạy lệnh gulp css của bạn và bạn sẽ thấy code đúng xuất hiện trong file "dest/style.css" của bạn.

Thiết lập thông qua Grunt

Vào dự án Grunt mới của bạn, cài đặt module grunt-contrib-less với npm install grunt-contrib-less, sau đó thêm một hàm grunt.loadNpmTasks() cho nó dưới cái hiện có mà bạn có cho PostCSS:

Bây giờ bạn sẽ cần phải thiết lập một tác vụ mới để xử lý LESS. Sau dòng này:

...nhưng trước tác vụ postcss hiện có, hãy bổ sung code này:

Bây giờ chúng ta sẽ đăng ký một tác vụ, để chạy LESS và sau đó là PostCSS. Sau hàm grunt.loadNpmTasks() bạn vừa thêm vào, hãy thêm:

Kiểm tra preprocessor

Để kiểm tra thiết lập của bạn, hãy đổi tên file “src/style.css” “style.less”. Thêm code LESS này vào:

Chạy lệnh grunt css và bạn sẽ thấy một file mới được tạo trong thư mục “dest” của bạn có tên “style.css” và chứa code này:

Thiết lập PostCSS

Bây giờ, chúng ta sẽ thêm các plugin PostCSS của chúng ta vào quá trình biên dịch. Cập nhật các processors của Gruntfile thành mảng sau:

Kiểm tra PostCSS

Thêm test code PostCSS vào file “style.less” của bạn, chạy lệnh grunt css lần nữa và bạn sẽ thấy file “dest/style.css” được biên dịch lại của bạn bây giờ chứa mã autoprefixed và được tối ưu hóa chính xác:

Trong Hướng dẫn tiếp theo

Tiếp theo, chúng ta sẽ xem xét điều gì đó mà bạn có thể xem xét một loại tiền xử lý khác - sử dụng PostCSS cho các class CSS tuân thủ BEM/SUIT được tạo tự động. Quá trình này làm cho việc phát triển BEM/SUIT dễ theo dõi hơn nhiều, chưa kể là hiệu quả hơn.

Hẹn gặp các bạn trong hướng dẫn tiếp theo!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.