【发布时间】:2019-10-08 08:27:21
【问题描述】:
我的vars.scss 中有一个变量,我想从root/app/app.vue 中的Javascript 访问它。
root/app/scss/vars.scss
:export {
cursor: #fff;
}
root/app/app.vue
<template>
<div id="yes">
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import colors from '@/scss/vars.scss';
export default Vue.extend({
mounted() {
console.log(colors.cursor);
},
});
</script>
<style >
</style>
我已经阅读了大约 30 个不同的 stackoverflow 问题,这些问题似乎正在处理将变量导入 .vue 文件的 style 块的类似问题,以及将变量直接导入 Javascript 的相同问题代码。结果,我的webpack.config.js 如下所示:
root/webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const webpack = require('webpack');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const env = process.env.NODE_ENV
module.exports = {
entry: './app/index.ts',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'staticfiles')
},
resolve: {
extensions: [ '.ts', '.js', '.vue', '.scss', '.sass'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': path.resolve(__dirname, '/app/')
}
},
plugins: [
new HtmlWebpackPlugin(),
new CleanWebpackPlugin(),
new webpack.HotModuleReplacementPlugin(),
new VueLoaderPlugin()
],
module: {
rules: [
{
enforce: 'pre',
test: /\.(js|vue|ts)$/,
loader: 'eslint-loader',
exclude: /node_modules/
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
// Since sass-loader (weirdly) has SCSS as its default parse mode, we map
// the "scss" and "sass" values for the lang attribute to the right configs here.
// other preprocessors should work out of the box, no loader config like this necessary.
'scss': 'vue-style-loader!css-loader!sass-loader',
'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax',
}
// other vue-loader options go here
}
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
]
},
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
options: {
appendTsSuffixTo: [/\.vue$/],
}
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
},
{
test: /\.s(a|c)ss$/,
use: [ {
loader: "style-loader",
options: {
sourceMap: env === 'development',
}
}, {
loader: "css-loader",
options: {
sourceMap: env === 'development',
}
}, {
loader: "sass-loader",
options: {
sourceMap: env === 'development',
}
},
'vue-style-loader'],
}]
}
};
我还尝试在 test: /\.s(a|c)ss$/ 部分中将 vue-style-loader 放在数组的开头。
我在尝试导入.scss文件时尝试了多种文件名组合,例如相对(../scss/vars.scss)、删除扩展名、使用.css作为扩展名等。
我得到的错误是:
ERROR in /home/Documents/application/app/app.vue.ts
[tsl] ERROR in /home/Documents/application/app/app.vue.ts(10,28)
TS2307: Cannot find module '@/scss/vars.scss'.
我的问题:
在使用vue-style-loader 和vue-loader 通过webpack 构建.vue 文件的项目中,如何将.scss 变量导入<script> 部分的.vue 文件? (请注意 - 我不会尝试将它们导入到 .vue 文件的 <style> 部分)
【问题讨论】:
-
为什么不简单地定义一个与 SCSS 变量相等的 CSS 自定义属性(又名 CSS 变量),然后直接通过
style.getProperty()读取? -
您想要实现的目标肯定可以工作,但您似乎只是在解析文件时遇到了问题。尝试使用相对路径而不是绝对路径,例如
import colors from './scss/vars.scss';
标签: javascript vue.js webpack sass vue-loader