SASS localIdentName блокирует CSS - PullRequest
       28

SASS localIdentName блокирует CSS

0 голосов
/ 14 декабря 2018

В своем приложении React я использую SASS, создав *.scss файлы и jQuery для перемещения боковой панели.Затем они прекомпилируются, также создаются *.scss.d.ts файлы, которые используются для импорта их в * .tsx файлы с import * as Style from "./filename.scss";, так что их записи могут использоваться как Style.sidebar.

В настоящее время я генерирую имена спараметр localIdentName в webpack.config.js с [local], но мне бы хотелось, чтобы это было менее глобальным и скорее локальным, поэтому я подумал о настройке localIdentName в [name]_[local]_[hash:base64][local] это работает, но не работает с [name]_[local]_[hash:base64].Я не могу понять, почему.

Используемые версии:

  "dependencies": {
    "@types/jquery": "^3.3.22",
    "@types/react": "^16.4.18",
    "@types/react-dom": "^16.0.9",
    "@types/react-router-dom": "^4.3.1",
    "bootstrap": "^4.1.3",
    "jquery": "^3.3.1",
    "popper.js": "^1.14.4",
    "react": "^16.6.0",
    "react-dom": "^16.6.0",
    "react-router-dom": "^4.3.1"
  },
  "devDependencies": {
    "autoprefixer": "^9.3.1",
    "awesome-typescript-loader": "^5.2.1",
    "css-loader": "^1.0.1",
    "html-webpack-plugin": "^3.2.0",
    "node-sass": "^4.10.0",
    "postcss-loader": "^3.0.0",
    "sass-loader": "^7.1.0",
    "source-map-loader": "^0.2.4",
    "style-loader": "^0.23.1",
    "tslint": "^5.11.0",
    "typescript": "^3.1.6",
    "typings-for-css-modules-loader": "^1.7.0",
    "webpack": "^4.25.1",
    "webpack-cli": "^3.1.2",
    "webpack-dev-server": "^3.1.10"
  }

Настройки правил модуля в webpack.config.js для сгенерированных имен CSS (localIdentName): [local]:

        {
            test: /\.scss$/,
            exclude: /\.global.scss$/,
            use : [
                { loader: "style-loader" },
                { loader: "typings-for-css-modules-loader", options: { modules: true, namedExport: true, camelCase: true, localIdentName: "[local]" }},
                { loader: "postcss-loader", options: { plugins: function () { return [ require("autoprefixer") ]; }}},
                { loader: "sass-loader" }
            ]
        },

        {
            test: /\.scss$/,
            include: /\.global.scss$/,
            use : [
                { loader: "style-loader" },
                { loader: "css-loader" },
                { loader: "postcss-loader", options: { plugins: function () { return [ require("autoprefixer") ]; }}},
                { loader: "sass-loader" }
            ]
        }

Файл scss выглядит следующим образом:

.tourDisplay {
    /* padding: 0.5rem 1rem; */
    padding: 0;
}

.wrapper {
    display: flex;
    align-items: stretch;
}

#sidebar {
    background: #7386D5;
    color: #fff;
    transition: all 0.3s;
    min-width: 250px;
    max-width: 250px;
    min-height: 100vh;
}

#sidebar.active {
    margin-left: -250px;
}

@media (max-width: 768px) {
    #sidebar {
        margin-left: -250px;
    }

    #sidebar.active {
        margin-left: 0;
    }
}

Файл tsx выглядит следующим образом:

import * as $ from "jquery";
import * as React from "react";
import * as Style from "./TourDisplay.scss";

export interface TourDisplayProps {
    match: any;
}

export interface TourDisplayStats {
}

export class TourDisplay extends React.Component<TourDisplayProps, TourDisplayStats> {
    public render() {
        return <div className={Style.tourDisplay + " bg-white text-dark"}>

            <div className={Style.wrapper}>

                <nav id={Style.sidebar}>
                    Sidebar
                </nav>

                <div id="content">
                    <button type="button"
                            className="btn btn-info"
                            onClick={() => this.handleToggleClick()}>
                        Toggle Sidebar
                    </button>
                </div>
            </div>

        </div>;
    }

    private handleToggleClick() {
        const sidebarId: string = "#" + Style.sidebar;
        $(sidebarId).toggleClass("active");
    }
}

Теперь, чтобы подвести итог.Все отлично работает с [local], нажатие кнопки перемещает боковую панель.Если я установлю на [name]_[local]_[hash:base64] нажатие кнопки, то ничего не происходит, следовательно, она не работает.

Почему она не работает с настройкой [name]_[local]_[hash:base64]?Что я должен сделать, чтобы заставить его работать?

Редактировать 1:

Я считаю, что scss часть с #sidebar.active не переведена в CSS правильно.Может быть ошибка компиляции?

#sidebar.active {
    margin-left: -250px;
}

и

@media (max-width: 768px) {
    #sidebar.active {
        margin-left: 0;
    }
}
...