Nhập tệp CSS thường xuyên trong tệp SCSS?


509

Có cách nào để nhập tệp CSS thông thường bằng @importlệnh của Sass không? Mặc dù tôi không sử dụng tất cả cú pháp SCSS từ sass, tôi vẫn thích tính năng kết hợp / nén của nó và muốn có thể sử dụng nó mà không cần đổi tên tất cả các tệp của mình thành * .scss


1
Có, có một cách: chỉ cần xóa phần mở rộng '.css' trong đường dẫn tệp css trong câu lệnh @input :) (hoạt động cho phiên bản sass> = 3.2)
Kamil Kiełczewski

Kể từ năm 2018, sử dụng SASS@import trong tệp CSS thông thường sẽ chỉ tạo CSS @import thông thường . Điều đó có nghĩa là thêm một yêu cầu HTTP và không kết hợp hoặc nén. Nếu một số triển khai hoạt động khác đi thì tôi sẽ nói đó là một tính năng không chuẩn, khác với thông số ngôn ngữ.
Álvaro González

Câu trả lời:


215

Có vẻ như điều này chưa được thực hiện, tính đến thời điểm viết bài này:

https://github.com/sass/sass/issues/193

Đối với libsass (triển khai C / C ++), nhập hoạt động *.csstheo cách tương tự như đối với *.scsscác tệp - chỉ cần bỏ qua phần mở rộng:

@import "path/to/file";

Điều này sẽ nhập khẩu path/to/file.css.

Xem câu trả lời này để biết thêm chi tiết.

Xem câu trả lời này để thực hiện Ruby (sass gem)


23
@kleinfreund không đúng với Sass 3.3.1. Câu @importlệnh hoàn toàn không thay đổi và xuất hiện trong tệp CSS kết quả, Sass không bao gồm tệp CSS được tham chiếu như @GSto đang hỏi. Có vẻ như nó sẽ được triển khai trong Sass 3.4 hoặc 4.0
fregante

1
Nếu bạn đang sử dụng Gulp hoặc Grunt, chỉ cần sử dụng một công cụ khác để nhập các tệp CSS của bạn, điều đó dễ dàng hơn và nó hoạt động ngay bây giờ . Tôi sử dụng gulp-import-css , tôi không chắc Grunt tương đương với cái gì.
fregante

3
Nó hoạt động với libsassít nhất. Xem câu trả lời stackoverflow.com/questions/7111610/ Mạnh và PR github.com/sass/libsass/pull/754
ivn

"Nhập hoạt động *.csstheo cách tương tự như đối với *.csstệp" là một tautology. Bạn có nghĩa là cho một trong số đó *.scss, phải không?
gạch dưới

1
Bắt đầu từ phiên bản 3.5.3, libsass cảnh báo rằng đây là hành vi không chuẩn và không nên dựa vào. (Thay vì "Sử dụng một nhà nhập khẩu tùy chỉnh để duy trì hành vi này.") Github.com/sass/libsass/releases/tag/3.5.3
iX3

383

Sau khi có cùng một vấn đề, tôi đã nhầm lẫn với tất cả các câu trả lời ở đây và các ý kiến ​​về kho lưu trữ của sass trong github.

Tôi chỉ muốn chỉ ra rằng vào tháng 12 năm 2014, vấn đề này đã được giải quyết. Bây giờ có thể nhập csstệp trực tiếp vào tệp sass của bạn. Các PR sau trong github giải quyết vấn đề.

Cú pháp giống như bây giờ - @import "your/path/to/the/file", không có phần mở rộng sau tên tệp. Điều này sẽ nhập tệp của bạn trực tiếp. Nếu bạn nối *.cssvào cuối, nó sẽ chuyển thành cssquy tắc @import url(...).

Trong trường hợp bạn đang sử dụng một số gói mô-đun mới "lạ mắt" như webpack , có lẽ bạn sẽ cần sử dụng sử dụng ~ở đầu đường dẫn. Vì vậy, nếu bạn muốn nhập đường dẫn sau, node_modules/bootstrap/src/core.scssbạn sẽ viết một cái gì đó như thế
@import "~bootstrap/src/core".

LƯU Ý:
Có vẻ như điều này không làm việc cho tất cả mọi người. Nếu thông dịch viên của bạn dựa trên libsasssẽ hoạt động tốt (kiểm tra cái này ). Tôi đã thử nghiệm bằng cách sử dụng @importnút-sass và nó hoạt động tốt. Thật không may, điều này hoạt động và không hoạt động trên một số trường hợp ruby.


1
Điều này dường như được thực hiện trong libsassnhưng khi sử dụng ruby ​​của sass, có vẻ như cú pháp này hoạt động, nhưng chỉ khi bạn có sass-css-importeryêu cầu. Ít nhất đó là những gì tôi đang thấy. bất cứ ai khác có thể xác nhận điều này?
bsara

5
Bạn có chắc chắn bạn có phiên bản mới nhất của sass? Tôi đã sử dụng cú pháp này trong một thời gian và nó hoạt động tốt với cả hai rubynodejsngười phiên dịch. Bạn đã kiểm tra nếu bạn không đặt tiện ích mở rộng sau tên tệp chưa? Cú pháp đúng là @import "path/to/style/file(không có .cssphần mở rộng)
tftd 29/07/2015

4
Tôi đang sử dụng ruby ​​sass v3.4.18 (với Jekyll) theo Gemfile.lock của tôi. Vẫn thấy Error: File to import not found or unreadable: cssdep/cssfile. Nếu tôi tạo ra cssdep/cssfile.scssnó đột nhiên hoạt động. Vì vậy, không phải là vấn đề về đường dẫn, vì một số lý do tôi vẫn không thể bao gồm các tệp '.css' từ SASS :(
thom_nic

1
ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] sass -v: Sass 3.4.17 (Selective Steve)Không làm việc ở đây
Cyril Chapon

5
Cảm ơn vì điều này! Tôi đã có thể nhập normalize.css bằng cách sử dụng nút-sass với@import "node_modules/normalize.css/normalize";
Nick

260

Bạn phải thêm một dấu gạch dưới vào tệp css để được bao gồm và chuyển phần mở rộng của nó thành scss (ví dụ _yourfile.scss:). Sau đó, bạn chỉ cần gọi nó theo cách này:

@import "yourfile";

Và nó sẽ bao gồm các nội dung của tệp, thay vì sử dụng lệnh @import tiêu chuẩn CSS.


1
Đó có thể là một cái gì đó về quy ước và tiêu chuẩn.
David Morales

70
Gạch dưới là để ngăn chặn nó được biên dịch thành một tệp riêng biệt.
Giô-na

4
Trong trường hợp bất kỳ ai thắc mắc, điều này hoạt động vì cú pháp SCSS của Sass là siêu bộ CSS3. Đó cũng là lý do tại sao dấu chấm phẩy là cần thiết.
Jacob Wan

46
Bạn không thể thay đổi phần mở rộng của một số tệp CSS của nhà cung cấp chẳng hạn.
Slava Fomin II

7
Nếu nó trên máy tính / máy chủ của bạn, bạn có thể! Và cũng có liên kết tượng trưng nếu bạn không muốn.
ste

260

Điều này đã được thực hiện và sáp nhập bắt đầu từ phiên bản 3.2( kéo # 754 sáp nhập vào ngày 02 tháng 1 năm 2015 cho libsass, vấn đề originaly được xác định ở đây: sass# 193 # 556 , libsass# 318 ).

Để cắt ngắn câu chuyện dài, cú pháp tiếp theo:

  1. để nhập (bao gồm) tệp CSS thô

    cú pháp không có.css phần mở rộng ở cuối (kết quả là đọc thực tế một phần s[ac]ss|cssvà bao gồm cả nội tuyến của SCSS / SASS):

    @import "path/to/file";

  2. để nhập tệp CSS theo cách truyền thống

    cú pháp đi theo cách truyền thống, với .cssphần mở rộng ở cuối (kết quả là @import url("path/to/file.css");trong CSS đã biên dịch của bạn):

    @import "path/to/file.css";

Và nó là rất tốt: cú pháp này là thanh lịch và laconic, cộng với tương thích ngược! Nó hoạt động xuất sắc với libsassnode-sass.

__

Để tránh những suy đoán thêm trong các bình luận, hãy viết điều này một cách rõ ràng: Sass dựa trên Ruby vẫn có tính năng này chưa được thực hiện sau 7 năm thảo luận. Tại thời điểm viết câu trả lời này, người ta hứa rằng trong 4.0 sẽ có một cách đơn giản để thực hiện điều này, có thể là với sự giúp đỡ của . Có vẻ như sẽ sớm triển khai, thẻ "Đề xuất được chấp nhận" "đã được lên kế hoạch" đã được chỉ định cho vấn đề # 556 và tính năng mới .@use@use

Câu trả lời có thể được cập nhật, ngay khi có gì đó thay đổi .


3
chỉ để làm rõ, nhập css dưới dạng sass hoạt động như thế này đối với tôi: @import url ("path / to / file-without-css-extension");
Craig Wayne

1
Điều này không thực sự hoạt động trong phiên bản sass dựa trên ruby. Ví dụ: lệnh: sass myFile.scss: output.css không thành công khi nhập css, nhưng hoạt động khi bạn thay đổi phần mở rộng của tệp .css thành .scss. Chạy với phiên bản mới nhất khi viết nhận xét này: 3.4.22 / Steve chọn lọc. Điều này cũng ảnh hưởng đến bất kỳ người chạy nhiệm vụ nào khi sử dụng phiên bản ruby, như grunt-contrib-sass.
anuptensen

@ansorensen, tôi nghĩ có sự nhầm lẫn từ phía bạn. Ý bạn là gì khi "hoạt động khi bạn thay đổi phần mở rộng của tệp .css thành .scss" ? Toàn bộ ý tưởng là chính xác về các tệp CSS thông thường và hai cách làm việc với chúng (đừng nhầm lẫn với việc nhập SCSS). Xin vui lòng đọc thêm một lần câu hỏi và câu trả lời.
Farside

@Farside Không nhầm lẫn. Cú pháp nhập 'đường dẫn / đến / tệp' không hoạt động trong phiên bản mới nhất của đá quý sass trong Ruby. Khi tôi chạy sass với một lần nhập, quá trình nhập hoạt động thành công khi tệp tại đường dẫn được nhập có phần mở rộng .scss và không thành công khi tệp có .css. Câu hỏi yêu cầu nhập css vào scss và bạn cung cấp câu trả lời cho lib-sass & node-sass. Tôi nhận xét rằng chức năng này không có trong các phiên bản sass dựa trên ruby.
anuptensen

1
@ansorensen, omg, rất nhiều văn bản từ bạn ... Tôi đã rõ ràng và không nhầm lẫn bất cứ ai. Node-sasslà thư viện Node.js LibSass ( phiên bản C của Sass). Không một đề cập nào libsasshoặc node-sassdựa trên Ruby, không một đề cập duy nhất về phiên bản RUBY chỉ trong câu hỏi ban đầu. Xin vui lòng, đọc kỹ, trước khi viết 3 bình luận liên tiếp vào lần tới. Tôi có tất cả các tài liệu tham khảo: theo vấn đề # 193, nó vẫn chưa được triển khai sau 5 năm thảo luận cho phiên bản Ruby, họ chỉ hứa hẹn chức năng này khi ver. 4.0 sẽ có sẵn.
Farside

37

Tin vui cho mọi người, Chris Eppstein đã tạo ra một plugin la bàn với chức năng nhập css nội tuyến:

https://github.com/chriseppstein/sass-css-importer

Bây giờ, nhập tệp CSS dễ dàng như:

@import "CSS:library/some_css_file"

3
Thất bại do sử dụng điểm bắt đầu không dùng nữa. "Cái gì là, nhưng không bao giờ có thể ..." Tôi chắc chắn rằng nó thật tuyệt khi lần đầu tiên ra mắt, nhưng nó cần một bản cập nhật để hoạt động trở lại, hoặc bạn phải cài đặt các plugin không dùng nữa. Cảm ơn, C §
CSS

18

Nếu bạn có một .csstệp mà bạn không muốn sửa đổi, thì cũng không thay đổi phần mở rộng của nó thành .scss( ví dụ: tệp này là từ một dự án rẽ nhánh mà bạn không duy trì ), bạn luôn có thể tạo một liên kết tượng trưng và sau đó nhập nó vào .scss.

Tạo một liên kết tượng trưng:

ln -s path/to/css/file.css path/to/sass/files/_file.scss


Nhập tệp symlink vào mục tiêu .scss:

@import "path/to/sass/files/file";


Tệp đầu ra mục tiêu của bạn .csssẽ giữ nội dung từ .scsstệp symlink đã nhập , không phải là quy tắc nhập CSS ( được đề cập bởi @yaz với số phiếu nhận xét cao nhất ). Và bạn không có các tệp trùng lặp với các tiện ích mở rộng khác nhau, điều đó có nghĩa là bất kỳ cập nhật nào được thực hiện bên trong .csstệp ban đầu ngay lập tức được nhập vào đầu ra mục tiêu của bạn.

Liên kết tượng trưng (cũng là liên kết tượng trưng hoặc liên kết mềm) là một loại tệp đặc biệt chứa tham chiếu đến một tệp khác ở dạng đường dẫn tuyệt đối hoặc tương đối và ảnh hưởng đến độ phân giải tên đường dẫn.
- http://en.wikipedia.org/wiki/Symbolic_link


9
Thêm một liên kết tượng trưng không phải là một giải pháp rất di động (tức là nhiều nhà phát triển hoặc xây dựng hệ thống)
LocalPCGuy

@LocalPCGuy, đó là, khi cả hai tệp ( .cssvà symlink được tạo) đều có sẵn cho mọi người thông qua kho lưu trữ được chia sẻ, chẳng hạn.
Nik Sumeiko

Tôi mới làm điều này và sẽ trả lời về các liên kết sym trên chủ đề này, nhưng rất vui vì nó đã ở đây! Đúng là nhu cầu này rất hiếm, nhưng tình huống của tôi liên quan đến việc không muốn sửa đổi tệp CSS (vì đó là tệp bower), do đó, xây dựng một liên kết tượng trưng và nhập hoạt động hoàn hảo.
Aaron Krauss

2
Đối với người dùng Windows , chức năng tương tự sẽ có một cú pháp khác mklink /H <link> <target>và được gọi là liên kết cứng @mrsafraz.
Farside

5

Bạn có thể sử dụng bên thứ ba importerđể tùy chỉnh @importngữ nghĩa.

node-sass-import-once , hoạt động với node-sass (đối với Node.js) có thể nhập nội tuyến các tệp CSS.

Ví dụ về sử dụng trực tiếp:

var sass = require('node-sass');,
    importOnce = require('node-sass-import-once');

sass.render({
  file: "input.scss",
  importer: importOnce,
  importOnce: {
    css: true,
  }
});

Ví dụ cấu hình grunt-sass :

var importOnce = require("node-sass-import-once");
grunt.loadNpmTasks("grunt-sass");

grunt.initConfig({
  sass: {
    options: {
      sourceMap: true,
      importer: importOnce
    },
    dev: {
      files: {
        "dist/style.css": "scss/**/*.scss"
      }
    }
  });

Lưu ý rằng nút-sass-import-once hiện không thể nhập các phần Sass mà không có dấu gạch dưới hàng đầu rõ ràng. Ví dụ với tệp partials/_partial.scss:

  • @import partials/_partial.scss thành công
  • @import * partials/partial.scss thất bại

Nói chung, hãy lưu ý rằng một nhà nhập khẩu tùy chỉnh có thể thay đổi bất kỳ ngữ nghĩa nhập khẩu nào . Đọc tài liệu trước khi bạn bắt đầu sử dụng nó.


4

Nếu tôi đúng css tương thích với scss để bạn có thể thay đổi phần mở rộng của css thành scss và nó sẽ tiếp tục hoạt động. Khi bạn thay đổi tiện ích mở rộng, bạn có thể nhập nó và nó sẽ được bao gồm trong tệp.

Nếu bạn không làm điều đó, sass sẽ sử dụng css @import, thứ bạn không muốn.


16
thật không may, đôi khi các tệp css đã nhập nằm ngoài tầm kiểm soát của bạn, như trong thư viện chứa một số tài sản tĩnh.
Eric Drechsel

2

Tôi đã tìm ra một cách thanh lịch, giống như Rails để làm điều đó. Đầu tiên, đổi tên .scsstệp của bạn thành .scss.erb, sau đó sử dụng cú pháp như thế này (ví dụ cho nội dung CSS gem_js-rails4 ):

@import "<%= asset_path("highlight_js/github") %>";

Tại sao bạn không thể lưu trữ tệp trực tiếp qua SCSS :

Thực hiện @importtrong SCSS hoạt động tốt cho các tệp CSS miễn là bạn sử dụng rõ ràng đường dẫn đầy đủ theo cách này hay cách khác. Trong chế độ phát triển, rails sphục vụ tài sản mà không cần biên dịch chúng, vì vậy một đường dẫn như thế này hoạt động ...

@import "highlight_js/github.css";

... bởi vì đường dẫn được lưu trữ theo nghĩa đen /assets/highlight_js/github.css. Nếu bạn nhấp chuột phải vào trang và "xem nguồn", sau đó nhấp vào liên kết cho biểu định kiểu với ở trên @import, bạn sẽ thấy một dòng trong đó trông giống như:

@import url(highlight_js/github.css);

Công cụ SCSS dịch "highlight_js/github.css"sang url(highlight_js/github.css). Điều này sẽ hoạt động một cách bơi lội cho đến khi bạn quyết định thử chạy nó trong sản xuất, nơi các tài sản được biên dịch trước có một hàm băm được chèn vào tên tệp. Tệp SCSS vẫn sẽ phân giải thành một tĩnh /assets/highlight_js/github.csskhông được biên dịch trước và không tồn tại trong sản xuất.

Giải pháp này hoạt động như thế nào:

Đầu tiên, bằng cách di chuyển .scsstệp đến .scss.erb, chúng tôi đã biến SCSS thành một khuôn mẫu cho Rails một cách hiệu quả. Bây giờ, bất cứ khi nào chúng tôi sử dụng <%= ... %>thẻ mẫu, bộ xử lý mẫu Rails sẽ thay thế các đoạn mã này bằng đầu ra của mã (giống như bất kỳ mẫu nào khác).

Nói rõ asset_path("highlight_js/github")trong .scss.erbtập tin có hai điều:

  1. Kích hoạt rake assets:precompiletác vụ để biên dịch trước tệp CSS thích hợp.
  2. Tạo một URL phản ánh thích hợp tài sản bất kể môi trường Rails.

Điều này cũng có nghĩa là công cụ SCSS thậm chí không phân tích tệp CSS; nó chỉ lưu trữ một liên kết đến nó! Vì vậy, không có bản vá khỉ khỉ hoặc cách giải quyết khác. Chúng tôi đang phục vụ một tài sản CSS thông qua SCSS như dự định và sử dụng URL để nói tài sản CSS như Rails dự định. Ngọt!


Đối với tôi giải pháp có vẻ hơi mờ ám và nghe giống như một bản hack. Nhưng đó là một công việc tốt về điều tra!
Farside

0

Cách giải quyết đơn giản:

Tất cả, hoặc gần như tất cả các tập tin css cũng có thể được hiểu như thể nó sẽ là scss. Nó cũng cho phép nhập chúng trong một khối. Đổi tên css thành scss và nhập nó như vậy.

Trong cấu hình thực tế của tôi, tôi làm như sau:

Đầu tiên tôi sao chép tệp .css thành tệp tạm thời, lần này có phần mở rộng .scss. Cấu hình ví dụ Grunt:

copy: {
    dev: {
        files: [
            {
                src: "node_modules/some_module/some_precompiled.css",
                dest: "target/resources/some_module_styles.scss"
            }
        ]
    }
}

Sau đó, bạn có thể nhập tệp .scss từ scss cha của bạn (trong ví dụ của tôi, nó thậm chí được nhập vào một khối):

my-selector {
  @import "target/resources/some_module_styles.scss";
  ...other rules...
}

Lưu ý: điều này có thể nguy hiểm, vì nó sẽ dẫn đến hiệu quả là css sẽ được phân tích cú pháp nhiều lần. Kiểm tra css ban đầu của bạn để biết nó có chứa bất kỳ tạo tác nào có thể hiểu được scss (không thể thực hiện được, nhưng nếu nó xảy ra, kết quả sẽ khó gỡ lỗi và nguy hiểm).


-3

Bây giờ có thể sử dụng:

@import 'CSS:directory/filename.css';

3
chỉ khi gem sass-css-importerđược cài đặt, sass được gọi bằng switch -r sass-css-importer.cssđược bỏ qua khỏi đường dẫn tệp
Bernhard Döbler

-4

Tôi có thể xác nhận điều này hoạt động:

class CSSImporter < Sass::Importers::Filesystem
  def extensions
    super.merge('css' => :scss)
  end
end

view_context = ActionView::Base.new
css = Sass::Engine.new(
  template,
  syntax:     :scss,
  cache:      false,
  load_paths: Rails.application.assets.paths,
  read_cache: false,
  filesystem_importer: CSSImporter # Relevant option,

  sprockets:  {
    context:     view_context,
    environment: Rails.application.assets
  }
).render

Tín dụng cho Chriss Epstein: https://github.com/sass/sass/issues/193


1
Làm thế nào bạn có thể sử dụng điều này trong tập tin scss của bạn?
Adrian Ber

-10

Đơn giản.

@import "đường dẫn / đến / file.css";


6
Tôi đã thử điều này, nhưng nó sẽ không kéo nội dung của tệp vào tệp đó khi nén nó, nó sẽ chỉ giữ dòng @import.
GSto

1
Câu trả lời thấp nhất, nhưng trớ trêu thay, điều này dường như là đúng cách, bây giờ. Bao gồm hậu tố là điều đúng đắn.
Wyck
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.