最终实现方法
// vue.config.js
let styleVariables = require('./scss.js')
module.exports = {
css: {
loaderOptions: {
sass: {
prependData: "@import 'uview-ui/theme.scss';" +
Object.keys(styleVariables)
.map(k => `\$${k.replace(/_/g, '-')}: ${styleVariables[k]};`)
.join('\n')
},
scss: {
prependData: "@import 'uview-ui/theme.scss';" +
Object.keys(styleVariables)
.map(k => `\$${k.replace(/_/g, '-')}: ${styleVariables[k]};`)
.join('\n')
}
}
},
}
// main.js
import scss from '@/scss.js'
Vue.prototype.$scss = scss
注:
也尝试通过通过以下方法加载,这样在uni.scss中添加或引入的代码同样可用,但是触发一个未知问题,目前还没有解决。
问题:
- 如果删除方法内return之前的代码,并console.log(options),那么是可以打印出数据的
- 但是console.log(options.prependData)却提示unidefined,奇怪的是只打印options时是包含prependData的
- 并且在console.log(options)之前或者之后操作一下options,其打印的结果也是options
let styleVariables = require('./scss.js')
function appScssVar(oldVarString) {
const newData = Object.keys(styleVariables)
.map(k => `\$${k.replace(/_/g, '-')}: ${styleVariables[k]};`)
.join('\n')
return oldVarString + '\n' + newData
}
module.exports = {
chainWebpack: webpackConfig => {
const cssTypes = ['vue-modules', 'vue', 'normal-modules', 'normal']
cssTypes.forEach(type => {
webpackConfig.module.rule('scss').oneOf(type).use('sass-loader').tap(options => {
// 如果删除方法内return之前的代码,并console.log(options),那么是可以打印出数据的
// 但是console.log(options.prependData)却提示unidefined,奇怪的是只打印options时是包含prependData的
// 并且在console.log(options)之前或者之后操作一下options,其打印的结果也是options
if (!options.sassOptions) {
options.sassOptions = {}
}
options.prependData = appScssVar(options.prependData)
return options
})
webpackConfig.module.rule('sass').oneOf(type).use('sass-loader').tap(options => {
if (!options.sassOptions) {
options.sassOptions = {}
}
options.prependData = appScssVar(options.prependData)
return options
})
})
}
}