【问题标题】:Import a SCSS "exported" variable into the Javascript code within a .vue file that is loaded by vue-loader and bundled by webpack将 SCSS“导出”变量导入 .vue 文件中的 Javascript 代码,该文件由 vue-loader 加载并由 webpack 捆绑
【发布时间】: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-loadervue-loader 通过webpack 构建.vue 文件的项目中,如何将.scss 变量导入&lt;script&gt; 部分的.vue 文件? (请注意 - 我不会尝试将它们导入到 .vue 文件的 &lt;style&gt; 部分)

【问题讨论】:

  • 为什么不简单地定义一个与 SCSS 变量相等的 CSS 自定义属性(又名 CSS 变量),然后直接通过 style.getProperty() 读取?
  • 您想要实现的目标肯定可以工作,但您似乎只是在解析文件时遇到了问题。尝试使用相对路径而不是绝对路径,例如 import colors from './scss/vars.scss';

标签: javascript vue.js webpack sass vue-loader


【解决方案1】:

基于我的评论的示例:

SCSS 片段:

$foo: #333;

body {
    --variable-foo: $foo;
}

然后在 JavaScript 中的任何地方

const value = document.body.style.getPropertyValue("--variable-foo");
console.log(value); // outputs "#333"

【讨论】:

  • 我很感激 - 如果我必须这样做,我会的。不过,理想情况下,我将能够利用 scss export 功能,以便我的代码“保证”正确的值(出于好奇 - 如果我的客户有一个碰巧有的自定义样式表,这种方法会发生什么变量定义?)
  • CSS 变量的工作方式与任何其他属性一样。取决于定义它们的级联、特异性和顺序。
猜你喜欢
  • 2017-12-11
  • 1970-01-01
  • 2021-09-08
  • 2019-02-17
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多