當前位置:成語大全網 - 成語詞典 - 詳解如何在微信小程序中愉快地使用sass

詳解如何在微信小程序中愉快地使用sass

前言

在微信小程序中,css是用wxss來表示,但寫法基本壹致。需要註意的是wxss擴展了兩個特性,分別是:

尺寸單位

樣式導入

具體可參考wxss,此處不做過多贅述。

為了方便打包sass,我們使用gulp來處理我們的scss文件,將其轉換為wxss。

目錄結構

在開發中,我們壹般會有壹個src源代碼目錄,壹個dist目錄用來輸出我們打包的代碼。而本次講解用到的目錄結構如下:

build目錄用來配置我們的打包參數,目前裏面只有壹個config.js文件

dist目錄為打包輸出的目錄,也是小程序運行的目錄

gulpfile.js配置打包的任務

src就是我們的源代碼目錄

src的目錄結構如下:

安裝依賴

yarn add gulp gulp-sass gulp-rename gulp-replace gulp-tap gulp-clean -D

gulp和gulp-sass為打包sass必須,gulp-rename則負責把scss後綴改為wxss,gulp-replace負責內容的替換(這個後面會講到),gulp-tap用來處理當前執行的文件,gulp-clean負責清除我們不需要的文件。

sass打包配置

gulp配置打包sass非常簡單,代碼如下:

const gulp = require('gulp');

const sass = require('gulp-sass');

const rename = require('gulp-rename');

gulp.task('sass', () => gulp.src('./src/**/*.{scss,wxss}')

.pipe(sass().on('error', sass.logError))

.pipe(rename({

extname: '.wxss'

}))

.pipe(gulp.dest('./dist'))

);

這樣就可以完成了sass的配置,但是這樣會有問題。前面講到了wxss是支持樣式導入的,也就是說import語法wxss是支持的,但css不支持,因此sass打包會把import的文件打包到當前文件,從而導致當前文件的體積變大。由於微信限制單包代碼不能超過2M,因此當css越寫越多的時候,這種打包方式勢必會使樣式文件越來越大。

解決import導入問題

那如何解決import的導入問題呢,其實也比較簡單,說白了就是sass處理的時候,讓其不處理import部分的語句就可以了。有兩種方式可以做到,第壹種是改寫sass處理的源碼,當遇到import語句時跳過。第二種是,在把文件交給sass處理前,我們先把import語句部分註釋掉,這樣sass處理的時候就會忽略了,當sass處理完成後,再把註釋掉的語句打開即可。顯然第壹種成本比較高,也不好維護。我們采用第二種,代碼如下:

const gulp = require('gulp');

const sass = require('gulp-sass');

const replace = require('gulp-replace');

const rename = require('gulp-rename');

const clean = require('gulp-clean');

const tap = require('gulp-tap');

const path = require('path');

const config = require('./build/config');

const hasRmCssFiles = new Set();

gulp.task('sass', () => gulp.src('./src/**/*.{scss,wxss}')

.pipe(tap((file) => {

// 當前處理文件的路徑

const filePath = path.dirname(file.path);

// 當前處理內容

const content = file.contents.toString();

// 找到filter的scss,並匹配是否在配置文件中

content.replace(/@import\s+['|"](.+)['|"];/g, ($1, $2) => {

const hasFilter = config.cssFilterFiles.filter(item => $2.indexOf(item) > -1);

// hasFilter > 0表示filter的文件在配置文件中,打包完成後需要刪除

if (hasFilter.length > 0) {

const rmPath = path.join(filePath, $2);

// 將src改為dist,.scss改為.wxss,例如:'/xxx/src/scss/const.scss' => '/xxx/dist/scss/const.wxss'

const filea = rmPath.replace(/src/, 'dist').replace(/\.scss/, '.wxss');

// 加入待刪除列表

hasRmCssFiles.add(filea);

}

});

console.log('rm', hasRmCssFiles);

}))

.pipe(replace(/(@import.+;)/g, ($1, $2) => {

const hasFilter = config.cssFilterFiles.filter(item => $1.indexOf(item) > -1);

if (hasFilter.length > 0) {

return $2;

}

return `/** ${$2} **/`;

}))

.pipe(sass().on('error', sass.logError))

.pipe(replace(/(\/\*\*\s{0,})(@.+)(\s{0,}\*\*\/)/g, ($1, $2, $3) => $3.replace(/\.scss/g, '.wxss')))

.pipe(rename({

extname: '.wxss',

}))

.pipe(gulp.dest('./dist')));

在處理import的時候,還有個地方是需要註意的。在sass中,import除了能引入css外,也可以引入變量,函數。因此,我們在處理的時候也需要註意區分,變量和函數最好有壹個獨立的文件目錄存放,並且在import的時候,對於變量和函數,是必須交給sass處理的,也就是不能註釋掉。因此,在上面的代碼中,我們可以看到,我們引入了build目錄下的config,其配置了sass變量和函數存放的位置,這樣我們在打包的時候,遇到這樣的import語句,我們就跳過,交給sass處理,否則就代表其是引入了***用的樣式文件,這樣我們交給sass處理前,就先將其註釋掉,sass處理完成後再把註釋打開。另外,import的可能是壹個scss文件,但在轉成wxss的時候,已經將其後綴改為了wxss,因此,在將註釋打開的時候也需要更改相應的引入,這也就是gulp-replace包的作用。config的配置如下:

module.exports = {

cssFilterFiles: ['scss/var.scss'],

};

清理無用的wxss文件

前面講了,我們在sass中可能會定義壹些變量,函數,這些文件壹會壹並打包到dist目錄,但其內容是空的,這時候我們就需要對其進行清理,前面在打包過程中,我們有壹個set變量hasRmCssFiles記錄了相應的文件,這樣我們遍歷這個變量即可刪除相應的文件,代碼如下:

gulp.task('clean:wxss', () => {

const arr = [];

hasRmCssFiles.forEach((item) => {

arr.push(item);

});

return gulp.src(arr, { read: false })

.pipe(clean({ force: true }));

});

總結

wxss的特性

sass打包配置以及如何處理import語句

sass變量、函數的文件清理