毕业后一直从事js这一块的工作,没有写过css,对css的了解程度还停留在学校自学时的水平。基本功太差,最近开始深入学习了。
了解到sass和less比较流行,决定选一个,这俩的优劣就不讨论了。我选的sass,因为和ruby比较亲。
平常写sass的时候保存即编译这个是很有必要的,但最近我一直在用visual studio code开发,这个编辑器还不太成熟,不支持编译sass的功能,只能自己写脚本去搞了。
用gulp来干这活没什么可说的,npm上搜了一下,看中了gulp-ruby-sass,因为机器上装了ruby环境。接下来的剧本就是安装很顺利,使用很潇洒。
var gulp = require('gulp');var sass = require('gulp-ruby-sass');var group = require('gulp-group-files');var sassFiles = { "xxx" : { src: "./xxx/styles/sass/index.scss", dest: "./xxx/styles/" }};gulp.task('sass:compile',function (){ return group(sassFiles,function (key,fileset){ return sass(fileset.src) .on('error', function (err) { console.error('compile sass file error: %s', err.message); }) .pipe(gulp.dest(fileset.dest)); })();});gulp.task('sass:watch',function (){ gulp.watch('**/*.scss',['sass:compile'])});gulp.task('default',['sass:watch']);
代码看上去很nice吧,没什么问题,我还有点沾沾自喜呢。然而,今天遇到了这样一个怪事,也就是写这篇文章的由来。
当我把需要构建的项目增加了一项后,就出现了问题。talk is cheap,就直接show u the code了。
var gulp = require('gulp');var sass = require('gulp-ruby-sass');var group = require('gulp-group-files');var sassFiles = { "xxx" : { src: "./xxx/styles/sass/index.scss", dest: "./xxx/styles/" }, "yyy" : { src: "./yyy/styles/sass/index.scss", dest: "./yyy/styles/" }};gulp.task('sass:compile',function (){ return group(sassFiles,function (key,fileset){ return sass(fileset.src) .on('error', function (err) { console.error('compile sass file error: %s', err.message); }) .pipe(gulp.dest(fileset.dest)); })();});gulp.task('sass:watch',function (){ gulp.watch('**/*.scss',['sass:compile'])});gulp.task('default',['sass:watch']);
与上面的相比,只是多了一项需要编译的内容。看上去没什么问题,但是呢。编译生成的xxx/styles/index.css的内容实际为yyy/styles/index.css,有时也会反过来。
一度怀疑是自己代码有问题,改了好几次,问题依旧。没办法,只好去看gulp-ruby-sass源码了。大致了解了这个插件的原理,如下:
创建临时目录,用来存放编译生成的css文件;
调用sass命令,编译生成的css文件先放在临时目录;
将css文件内容读取成stream,pipe到gulp任务内定义的gulp.dest,这样就完成了scss文件的编译和css文件的生成;
将临时目录和临时文件删除
导致问题的原因就是这第4步的删除临时文件和目录,连续编译多个文件时只生成了一个临时目录,而第一个文件编译成功后临时目录被删除,后续的文件读取就会出错。根据操作的耗时,可能会取现以下情况:
两个文件中只有一个编译成功
两个文件内容相同(如果文件名相同)
文件内容不符
...
了解到gulp-ruby-sass的执行过程后,决定弃用,原因就是上面所列的问题,不想改自己的代码了。
继续npm上搜索,找到了gulp-sass。
npm install --save-dev gulp-sass,一番等待后,npm报错了。
wtf!!!好吧,就当是好事多磨吧。从npm-debug.log中可以看出,gulp-sass依赖了node-sass这个库。安装node-sass这个库的时候要执行一个脚本,而在这个过程中出错了,可以试下管理员身份安装。
用管理员身份再安装,这次成功了,然后改下gulpfile.js
var gulp = require('gulp');var sass = require('gulp-sass');var group = require('gulp-group-files');var sassFiles = { "xxx" : { src: "./xxx/styles/sass/index.scss", dest: "./xxx/styles/" }, "yyy" : { src: "./yyy/styles/sass/index.scss", dest: "./yyy/styles/" }};gulp.task('sass:compile',function (){ return group(sassFiles,function (key,fileset){ return gulp.src(fileset.src) .pipe(sass().on('error', sass.logError)) .pipe(gulp.dest(fileset.dest)); })();});gulp.task('sass:watch',function (){ gulp.watch('**/*.scss',['sass:compile'])});gulp.task('default',['sass:watch']);
通过查看依赖关系以及部分源码可以发现,gulp-ruby-sass和gulp-sass的区别就在于编译器的不同和编译过程不同。
gulp-ruby-sass是调用sass,所以需要ruby环境,需要生成临时目录和临时文件
gulp-sass是调用node-sass,有node.js环境就够了,编译过程不需要临时目录和文件,直接通过buffer内容转换。
搞定这个问题后,就可以愉快地使用了,我又能继续学习css了。

布爾屬性是HTML中的特殊屬性,不需要值即可激活。 1.布爾屬性通過存在與否控制元素行為,如disabled禁用輸入框。 2.它們的工作原理是瀏覽器解析時根據屬性的存在改變元素行為。 3.基本用法是直接添加屬性,高級用法可通過JavaScript動態控制。 4.常見錯誤是誤以為需要設置值,正確寫法應簡潔。 5.最佳實踐是保持代碼簡潔,合理使用布爾屬性以優化網頁性能和用戶體驗。

HTML代碼可以通過在線驗證器、集成工具和自動化流程來確保其清潔度。 1)使用W3CMarkupValidationService在線驗證HTML代碼。 2)在VisualStudioCode中安裝並配置HTMLHint擴展進行實時驗證。 3)利用HTMLTidy在構建流程中自動驗證和清理HTML文件。

HTML、CSS和JavaScript是構建現代網頁的核心技術:1.HTML定義網頁結構,2.CSS負責網頁外觀,3.JavaScript提供網頁動態和交互性,它們共同作用,打造出用戶體驗良好的網站。

HTML的功能是定義網頁的結構和內容,其目的在於提供一種標準化的方式來展示信息。 1)HTML通過標籤和屬性組織網頁的各個部分,如標題和段落。 2)它支持內容與表現分離,提升維護效率。 3)HTML具有可擴展性,允許自定義標籤增強SEO。

HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

HTML、CSS和JavaScript在網頁開發中的角色分別是:HTML負責內容結構,CSS負責樣式,JavaScript負責動態行為。 1.HTML通過標籤定義網頁結構和內容,確保語義化。 2.CSS通過選擇器和屬性控製網頁樣式,使其美觀易讀。 3.JavaScript通過腳本控製網頁行為,實現動態和交互功能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中