詳解vue項(xiàng)目中如何引入全局sass/less變量、function、mixin
讓我們考慮下場(chǎng)景:當(dāng)使用rem/vw開發(fā)移動(dòng)端的時(shí)候,你定義了一個(gè)px轉(zhuǎn)rem的函數(shù),或者是網(wǎng)站配色的全局變量等,然后到工程里為每個(gè)vue文件或者組件@import ‘publicfilename.scss',那得重復(fù)做這樣的工作很多很多...次,萬一這些公用文件目錄路徑變?cè)趺崔k呢,哭都來不及,想想都覺得恐怖呀!
接下來拯救我們的神器就要登場(chǎng)了---sass-resources-loader,它可以省去重復(fù)性的引入,還支持less,postcss等,具體用法如下:
npm install -d sass-resource-loader
首先我們找到項(xiàng)目里build目錄,在該目錄下找到util.js
更新前util.js代碼如下:
'use strict' const path = require('path') const config = require('../config') const ExtractTextPlugin = require('extract-text-webpack-plugin') const packageConfig = require('../package.json') exports.assetsPath = function (_path) { const assetsSubDirectory = process.env.NODE_ENV === 'production' ? config.build.assetsSubDirectory : config.dev.assetsSubDirectory return path.posix.join(assetsSubDirectory, _path) } exports.cssLoaders = function (options) { options = options || {} const cssLoader = { loader: 'css-loader', options: { sourceMap: options.sourceMap } } // generate loader string to be used with extract text plugin function generateLoaders (loader, loaderOptions) { const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] if (loader) { loaders.push({ loader: loader + '-loader', options: Object.assign({}, loaderOptions, { sourceMap: options.sourceMap }) }) } // Extract CSS when that option is specified // (which is the case during production build) if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader' }) } else { return ['vue-style-loader'].concat(loaders) } } // https://vue-loader.vuejs.org/en/configurations/extract-css.html return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') } } // Generate loaders for standalone style files (outside of .vue) exports.styleLoaders = function (options) { const output = [] const loaders = exports.cssLoaders(options) for (const extension in loaders) { const loader = loaders[extension] output.push({ test: new RegExp('\\.' + extension + '$'), use: loader }) } return output } exports.createNotifierCallback = () => { const notifier = require('node-notifier') return (severity, errors) => { if (severity !== 'error') return const error = errors[0] const filename = error.file && error.file.split('!').pop() notifier.notify({ title: packageConfig.name, message: severity + ': ' + error.name, subtitle: filename || '', icon: path.join(__dirname, 'logo.png') }) } } /** * 增加 hljs 的 classname */ exports.wrapCustomClass = function (render) { return function (...args) { return render(...args) .replace('<code class="', '<code class="hljs ') .replace('<code>', '<code class="hljs">') } } /** * Format HTML string */ exports.convertHtml = function (str) { return str.replace(/(&#x)(\w{4});/gi, $0 => String.fromCharCode(parseInt(encodeURIComponent($0).replace(/(%26%23x)(\w{4})(%3B)/g, '$2'), 16))) }
看util.js文件,我們首先找到我需要修改目標(biāo)在哪:
// https://vue-loader.vuejs.org/en/configurations/extract-css.html return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') }
我們那sass為例,用sass-resources-loader對(duì)其改造:
/** * sass Less 源文件 * @param name classFile * @returns {string} */ function resolveResouce(name) { return path.resolve(__dirname, '../static/' + name); } //導(dǎo)入全局sass mixin function等 function generateSassResourceLoader(){ var loaders = [ cssLoader, //'postcss-loader', 'sass-loader', { loader:'sass-resources-loader', options: { //需要一個(gè)全局路徑 resources: [resolveResouce('index.scss')] } } ] if(options.extract){ return ExtractTextPlugin.extract({ use:loaders, fallback: 'vue-style-loader' }) }else{ return ['vue-style-loader'].concat(loaders) } }
工具寫好好了,接下來直接把上門return對(duì)象做些調(diào)整,代碼如下
// https://vue-loader.vuejs.org/en/configurations/extract-css.html return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass:generateSassResourceLoader(), scss:generateSassResourceLoader(), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') }
從代碼中可以看出,我們把sass和scss的loader換成我們自己根據(jù)sass-resources-loader寫的方法了,這樣就實(shí)現(xiàn)了我們的目標(biāo)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue中使用refs定位dom出現(xiàn)undefined的解決方法
本篇文章主要介紹了vue中使用refs定位dom出現(xiàn)undefined的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12Vue中常用的rules校驗(yàn)規(guī)則的實(shí)現(xiàn)
在vue開發(fā)中,難免遇到各種表單校驗(yàn),本文主要介紹了Vue中常用的rules校驗(yàn)規(guī)則的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10vue?+?ele?實(shí)現(xiàn)下拉選擇框和下拉多選選擇框處理方案
這篇文章主要介紹了vue?+?ele?實(shí)現(xiàn)下拉選擇框和下拉多選選擇框處理方案,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Vue3將虛擬節(jié)點(diǎn)渲染到網(wǎng)頁初次渲染詳解
這篇文章主要為大家介紹了Vue3將虛擬節(jié)點(diǎn)渲染到網(wǎng)頁初次渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Vue組件通信入門之Provide和Inject機(jī)制
這篇文章主要給大家介紹了關(guān)于Vue組件通信入門之Provide和Inject機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue組件通信具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12vue實(shí)現(xiàn)登錄數(shù)據(jù)的持久化的使用示例
在Vue.js中,實(shí)現(xiàn)登錄數(shù)據(jù)的持久化需要使用瀏覽器提供的本地存儲(chǔ)功能,Vue.js支持使用localStorage和sessionStorage來實(shí)現(xiàn)本地存儲(chǔ),本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2023-10-10