CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết blog CFSDN CSS trong JS Rookie: Vanilla-Extract này được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm tới bài viết này thì nhớ like nhé.

Lời nói đầu
Vào năm 2021, vanilla-extract đứng đầu danh sách hài lòng của css-in-js với tư cách là một con ngựa ô (mặc dù tỷ lệ sử dụng chỉ là 1%). Nó được khẳng định là một thư viện an toàn về loại và có khả năng tương thích cao cho các kịch bản TS. Ở Trung Quốc có rất ít cuộc thảo luận liên quan, và nó hơi hữu ích. Sau khi xem xét, nó có vẻ khá hữu ích.

giới thiệu
Tài liệu chính thức: https://vanilla-extract.style/documentation/.
Mở tài liệu trang web chính thức chiết xuất vani, trong đó đã liệt kê các ưu điểm của nó. Là một người thích các thành phần theo kiểu nếu tôi sử dụng css-in-js, những điểm chính tôi tập trung vào là:
- Tất cả các kiểu được tạo ra tại thời điểm xây dựng
- Kiểu an toàn thông qua CSSType.
Nói một cách thẳng thắn, hai điểm này không có thời gian chạy và hỗ trợ cho bản đánh máy.
Thời gian chạy bằng không: vanilla-extract sẽ biên dịch các giá trị mô-đun CSS và nội dung CSS trong quá trình biên dịch. Không cần đưa bất kỳ nội dung thời gian chạy nào vào môi trường sản xuất. Nói một cách tương đối, tốc độ chạy cao hơn và kích thước sản phẩm nhỏ hơn. .
bản đánh máy: hỗ trợ kiểm tra loại bản ghi, an toàn CSS,
Hiện tại, hầu hết các sản phẩm cạnh tranh có liên quan trong ngành, chẳng hạn như các thành phần theo kiểu, là các giải pháp thời gian chạy và được viết dựa trên các mẫu thẻ. Chúng chủ yếu được phân tích cú pháp dựa trên trình phân tích cú pháp stylis. Nếu đạo cụ được cập nhật thường xuyên, một số lượng lớn các thẻ kiểu. sẽ được chèn vào đầu.
Cài đặt
Trong môi trường Webpack, bạn cần cài đặt các plugin @vanilla-extract/css và @vanilla-extract/webpack-plugin cùng lúc:
- sợi len thêm vào @vanilla-extract/css @vanilla-extract/webpack-plugin
Sau khi cài đặt hoàn tất, hãy sửa đổi cấu hình Webpack:
- const { VanillaExtractPlugin } = yêu cầu('@vanilla-extract/webpack-plugin')
-
- module.exports = {
- lối vào: './src/index.js',
- // ....
- plugin: [new VanillaExtractPlugin()]
- };
Như bạn có thể thấy ở đây, khi sử dụng vanilla-extract, chúng ta cần cài đặt hai thư viện:
- @vanilla-extract/css: Phát triển thư viện cốt lõi và phát triển phong cách kinh doanh dự án dựa trên thư viện này;
- @vanilla-extract/webpack-plugin: trình cắm webpack. Như đã đề cập trước đó, vanilla-extract là một thư viện không chạy, chủ yếu được xử lý thông qua plug-in này.
- Bằng cách thêm các mục cấu hình webpack, hãy sử dụng @vanilla-extract/webpack-plugi/loader tùy chỉnh để xử lý các tệp hậu tố liên quan.
- Trong nội bộ, thư viện eval được thực thi trước tiên trong quá trình biên dịch để thu được kết quả className nhằm tránh thực thi quy trình khi chạy;
- Sau đó xóa thư viện @vanilla-extract/css để nó không ảnh hưởng đến kích thước gói js trong môi trường sản xuất;
API kiểu xây dựng
Ở đây chúng tôi sẽ chỉ đề cập đến một số API liên quan đến phong cách xây dựng cốt lõi của vanilla-extract. Đối với các API khác, bạn có thể truy cập trực tiếp vào trang web chính thức để xem chúng.
phong cách .
- nhập khẩu { phong cách } từ '@vanilla-trích xuất/css';
-
- xuất khẩu const parentClass = style({
- lý lịch: 'màu đỏ',
- ':di chuột': {
- lý lịch: 'màu xanh da trời',
- },
- });
-
- xuất khẩu const childClass = style({
- bộ chọn: {
- '&:nth-child(2n)': {
- lý lịch: '#khám phá',
- },
- [`${lớp cha mẹ} &`]: {
- màu sắc: 'hồng',
- },
- },
- });
- nhập { childClass, parentClass } từ './index.styles.css';
-
- const Bản trình bày = () => (
-
-
DEMO1
-
DEMO2
-
DEMO3
-
- );
-
- xuất khẩu mặc định Thử nghiệm;
Tôi tin rằng bạn có thể hiểu cách sử dụng bản demo đơn giản này chỉ sau vài lần xem. Nhưng điều cần hiểu là để cải thiện khả năng bảo trì, "mỗi khối kiểu chỉ có thể nhắm mục tiêu đến một phần tử nhất định (hoặc phần tử sử dụng khối kiểu này)". Vì vậy, đối với các bộ chọn trong đoạn mã trên, "đích của nó phải là" **&** (nghĩa là phần tử của chính nó) chứ không phải các phần tử khác. Ví dụ: `${parentClass} &` thì được, nhưng `& div` thì không được phép. Tôi nghĩ kiểu thiết kế này thiên về sự phân chia trách nhiệm hơn. Mỗi khối kiểu dáng nhắm đến một thành phần nhất định, vì vậy đối với dự án, khả năng duy trì kiểu này được cải thiện rất nhiều so với các css khác trong js (các thành phần theo kiểu). không dễ xảy ra vấn đề dư thừa về phong cách. Đối với một số trường hợp đặc biệt, ví dụ: khi viết styled-comComponents, chúng ta sẽ sử dụng nó để bọc các thành phần arco (hoặc các thành phần khác), sau đó ghi đè hoặc thêm kiểu phần tử mới cho chúng.
- const StyledSelect = được tạo kiểu(Lựa chọn)`
- div {
- màu sắc: đỏ;
- }
- `
Sau đó, nó không thể được thực hiện trực tiếp trong khối kiểu trích xuất vanilla, bởi vì mỗi khối kiểu được nhắm mục tiêu vào một phần tử nhất định và bạn không thể điều chỉnh trực tiếp kiểu của các phần tử anh chị em và các phần tử phụ của nó thông qua khối kiểu. Tuy nhiên, trong trường hợp này, có thể phát triển bằng API GlobalStyle khác.
Kiểu toàn cầu 。
Đúng như tên gọi, đây là API kiểu toàn cầu. Tuy nhiên, vì chính mô-đun CSS chiết xuất vanilla được sử dụng nên mỗi className là duy nhất, do đó, việc sử dụng GlobalStyle để điều chỉnh kiểu và ghi đè các phần tử con của nó là hoàn toàn khả thi.
- nhập { style, globalStyle } từ '@vanilla-trích xuất/css';
-
- xuất khẩu const parentClass = style({});
-
- globalStyle(`${parentClass} > div`, {
- màu sắc: 'màu đỏ'
- });
-
- const Bản trình bày = () => (
-
- <Lựa chọn/>
-
- )
Ưu điểm so với Styled-Components
- Thời gian chạy bằng không;
- Phát triển phong cách áp dụng các loại an toàn Typescript;
- Tách biệt trách nhiệm thiết kế kiểu dáng (Tất nhiên, các thành phần theo kiểu cũng có thể thực hiện được, nhưng nó hoàn toàn phụ thuộc vào nhà phát triển)
- ...
Tóm tắt
Theo những gì tôi biết, vanilla-extract nhìn chung là một CSS tốt trong thư viện JS. Mặc dù tỷ lệ sử dụng hiện tại tương đối thấp, nhưng các dự án nền tảng của nhà sản xuất tiếp theo sẽ cân nhắc sử dụng nó ở một số nơi để xem hiệu quả (xét cho cùng, nó sẽ không tăng lên). kích thước của JS).
Liên kết gốc: https://mp.weixin.qq.com/s/ysjP4JoCDOIXLSXIf3WRpg.
Cuối cùng, bài viết này về CSS trong JS tân binh: Phân tích ngắn gọn về Vanilla-Extract kết thúc ở đây. Nếu bạn muốn biết thêm về CSS trong JS tân binh: Phân tích ngắn gọn về Vanilla-Extract, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan, tôi hy vọng vậy. bạn sẽ ủng hộ blog của tôi trong tương lai! .
-
node.js - backbone.js + node.js - express.js
Tôi đang tìm hiểu tất cả các công nghệ cần thiết để xây dựng một ứng dụng một trang (SPA). Tóm lại, tôi muốn triển khai ứng dụng của mình dưới dạng một lớp riêng biệt, trong đó giao diện người dùng chỉ giao tiếp với phần phụ trợ bằng dịch vụ web API (json qua socket.io). Về cơ bản thì mặt trước là
-
node.js - Sắp xếp lại js/express js/node js cách thay đổi định dạng ngày
Khi tôi thấy ngày được lưu trữ trong cơ sở dữ liệu của mình. Điều này là bình thường. Ngày và giờ chỉ có vậy thôi. Nhưng khi tôi chạy get request để lấy dữ liệu. Định dạng này khác với định dạng được lưu trữ trong cơ sở dữ liệu. Tại sao điều này xảy ra? Câu trả lời hay nhất tôi nghĩ bạn có thể đặt
-
history.js - So sánh giữa Sammy.js/History.js/Nav.js
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi hy vọng câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
-
backbone.js - Mustache.js/Hogan.js và Backbone.js
Tôi đang cố gắng triển khai một số mã bằng cách sử dụng Backbone.js và hogan.js (http://twitter.github.com/hogan.js/) Hogan.js đã được phát triển từ trước
-
node.js - Hàm người dùng trong Backbone.js Node.js Express.js
Tôi đang tạo một ứng dụng web bằng Backbone.js, Node.js và Express.js và muốn thêm chức năng người dùng (đăng nhập, đăng xuất, hồ sơ, hiển thị nội dung liên quan đến người dùng đó). Tôi sẽ sử dụng Passport
-
node.js - Sự khác biệt và tương đồng giữa Angular.js/D3.js/Node.js
đóng cửa. Câu hỏi này cần được hỏi tập trung hơn. Câu trả lời không được chấp nhận vào thời điểm này. Bạn muốn cải thiện vấn đề này? Đã cập nhật câu hỏi để chỉ tập trung vào một vấn đề chỉnh sửa bài đăng này. Đã đóng 8 năm trước. Cải thiện truy vấn này
-
node.js - d3.js、queue.js và node.js
Tôi đang cố tải dữ liệu trong NodeJS và sau đó chuyển nó sang ExpressJS để hiển thị biểu đồ d3 trong trình duyệt. Tôi biết tôi có thể tải dữ liệu theo cách này - https://github.com/mbostock/q
-
node.js - Các quy ước của app.js, index.js và server.js trong node.js là gì?
Trong node.js, tôi dường như gặp phải 3 tên tệp giống nhau mô tả điểm vào chính của ứng dụng: Khi sử dụng gói express-generator, một tệp app.js được tạo để đóng vai trò là điểm vào chính cho ứng dụng được tạo. bởi n
-
backbone.js - amplify.js và backbone.js
Gần đây, tôi có cơ hội xem lớp học xuất sắc của John Papa về xây dựng các ứng dụng một trang. Tôi sẽ thích nó. Nó chạm đến mọi khía cạnh của ứng dụng phía máy chủ và phía máy khách. Tôi thích phía khách hàng hơn. Trong quá trình thực hiện của mình, ông Papa có lớp ở phía khách hàng
-
Backbone.js - Sự khác biệt giữa Mustache.js, Handlebars.js và Underscore.js là gì?
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi hy vọng câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
-
d3.js - Pixi.js so với Konva.js so với D3.js
Tôi là người mới sử dụng đồ họa và cần trợ giúp để hiểu khả năng của các thư viện 2D javascript khác nhau. . Tôi nhận được gì từ Pixi.js mà tôi không nhận được từ các thư viện dựa trên Canvas như Konva? Tôi đến từ Konva
-
Ember.js: chuyển các tùy chọn tới node.js
Tôi đang cố gắng xây dựng một số mã LESS (thông qua ember-cli-less) vào tệp CSS. 1) https://almsaeedstudio.com/ AdminLTE ÍT tập tin 2) Bo
-
node.js - Đang cố gắng xem tất cả người dùng đã đăng nhập trong Express.js Node.js Passport.js
Đang cố gắng xem tất cả các phiên của tất cả người dùng đã đăng nhập trong Express Passport và hy vọng có thể xem người dùng hiện đang đăng nhập. Cách tốt nhất và nhanh nhất là gì? Tôi đang nghĩ có lẽ tôi có thể làm điều này khi đăng nhập và đưa cơ sở dữ liệu mô hình người dùng "trực tuyến"
-
node.js - React.js chạy JS máy khách sau khi kết xuất hoàn tất
Tôi có ứng dụng React nhưng tôi cần chạy một số js phía máy khách sau khi thành phần tải xong. Cách tốt nhất để chạy js tương tác với DOM là gì, chẳng hạn như $('div').mixItUp() sau khi chức năng kết xuất hoàn tất và được tải. Phải
-
node.js - Tải lên tệp thô bằng vue.js, node.js và express.js
Vui lòng cho tôi biết cách tải tệp lên máy khách express.js bằng cách sử dụng bodyparser.raw() // ... onFilePicked(file) { const url = 'upload/a
-
node.js - Gulp.js không thể biên dịch dự án Angular.js do có quá nhiều lỗi js?
Tôi đang cố gắng di chuyển từ Grunt sang Gulp. Dự án chạy tốt trong Grunt, vì vậy tôi chắc chắn đã làm sai điều gì đó trong Gulp. Tất cả các tác vụ khác ngoại trừ tập lệnh đều hợp lệ. Bây giờ tôi mệt mỏi với việc thêm và chú thích các phần. Tôi liên tục nhận được những điều ngạc nhiên với
-
Tiêu đề hoặc tên ứng dụng cho Sails.js (sử dụng node.js và express.js) ở đâu?
Tôi đang cố gắng thay đổi tên trang web của mình. Không thể tìm thấy nơi đặt tiêu đề hoặc tên ứng dụng. Câu trả lời hay nhất Bạn có thể tạo bất kỳ tệp nào trong thư mục config/, ví dụ config/app.js chứa nội dung sau: module.expor
-
node.js - Sử dụng ember.js với node.js + express.js
Sau nhiều năm phát triển PHP/MySQL phía máy chủ, tôi đang cố gắng khám phá các công nghệ mới để xây dựng các ứng dụng web hiện đại. Tôi đang cố gắng sắp xếp tất cả nội dung JavaScript và nếu tôi hiểu rõ về nó, một giải pháp hiệu quả có thể là phân phát
-
node.js - Sự khác biệt giữa app.js và index.js trong Node.js
Tôi mới làm quen với Nodejs. Tôi có app.js và index.js trong thư mục tuyến đường. Tôi có một app.use(multer....). Tôi cũng đã xác định app.post('filter-re
-
javascript - AngularJS 种子: đưa JavaScript vào các tệp riêng biệt (app. js、controllers.js、directives.js、filters.js、services.js)
Tôi đang sử dụng các mẫu hạt giống góc để xây dựng ứng dụng của mình. Ban đầu, tôi đặt tất cả mã JavaScript vào một tệp, main.js. Tệp này chứa khai báo mô-đun, Bộ điều khiển, chỉ thị, bộ lọc và
Tôi là một lập trình viên xuất sắc, rất giỏi!