Импортируйте «экспортированную» переменную SCSS в код Javascript в файле .vue, который загружается vue-loader и упаковывается в веб-пакет - PullRequest
0 голосов
/ 22 мая 2019

В моем vars.scss есть переменная, к которой я хочу получить доступ из Javascript в root/app/app.vue.

корень / приложение / СКС / vars.scss

:export {
    cursor: #fff;
}

корень / приложение / 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 различных вопросов о стековом потоке, которые, кажется, имеют дело с аналогичной проблемой импорта переменных в блок style файла .vue, а также с идентичной проблемой импорта переменных непосредственно в Javascript код. В результате мой webpack.config.js выглядит следующим образом:

корень / 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 для создания .vue файлов с помощью веб-пакета, как я могу импортировать .scss переменные в часть <script> файла .vue? (обратите внимание - я НЕ пытаюсь импортировать их в раздел <style> файла .vue)

1 Ответ

0 голосов
/ 22 мая 2019

Пример, основанный на моем комментарии:

Фрагмент SCSS:

$foo: #333;

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

И затем в любом месте JavaScript

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