在Webpack 2中使用TypeScript加载SASS模块

jmi*_*del 3 javascript sass typescript reactjs webpack

我有一个使用TypeScript,ReactJS和SASS设置的简单项目,并希望使用Webpack将其全部捆绑.有很多关于如何使用JavaScript和常规旧CSS实现此目的的文档.但是,我找不到任何组合我需要的加载器的文档,并使用Webpack 2语法(而不是加载器的原始Webpack语法).因此,我不确定如何创建正确的配置.

你可以webpack.config.js在这里找到我的文件.我如何修改配置以便TypeScript接受我的SCSS模块,以便Webpack正确地将我的SCSS与我的TypeScript捆绑在一起?

这可能也有帮助:当我运行Webpack时,我收到以下错误:

ERROR in ./node_modules/css-loader!./node_modules/typings-for-css-modules-loader/lib?{"namedExport":true,"camelCase":true}!./node_modules/sass-loader/lib/loader.js!./src/raw/components/styles.scss
Module build failed: Unknown word (1:1)

> 1 | exports = module.exports = require("../../../node_modules/css-loader/lib/css-base.js")(undefined);
    | ^
  2 | // imports
  3 |
  4 |

 @ ./src/raw/components/styles.scss 4:14-206
 @ ./src/raw/components/greetings/greetings.tsx
 @ ./src/raw/index.tsx
 @ multi ./src/raw/index.tsx

ERROR in [at-loader] ./src/raw/components/greetings/greetings.tsx:3:25
    TS2307: Cannot find module '../styles.scss'.
Run Code Online (Sandbox Code Playgroud)

请注意,这./src/raw/index.tsx是我的应用程序的入口点,./src/raw/components/greetings/greeting.tsx是我唯一的React组件,并且./src/raw/components/styles.scss是我唯一的SCSS文件.

Mic*_*ngo 6

typings-for-css-modules-loadercss-loader(技术上它css-loader在引擎盖下使用)的直接替代品,这意味着它需要CSS并将其转换为JavaScript.你也使用了css-loader,但是因为它接收了JavaScript而失败了,但是期望的CSS(因为JavaScript不是有效的CSS,它无法解析).

此外,您没有使用CSS模块,因为您没有modules: true在CSS加载器上设置选项(或者将typings-for-css-modules-loader其传递给它css-loader).

你的.scss规则应该是:

{
    test: /\.scss$/,
    include: [
        path.resolve(__dirname, "src/raw")
    ],
    use: [
        { loader: "style-loader" },
        {
            loader: "typings-for-css-modules-loader",
            options: {
                namedexport: true,
                camelcase: true,
                modules: true
            }
        },
        { loader: "sass-loader" }
    ]
}
Run Code Online (Sandbox Code Playgroud)


fre*_*evd 5

这是一个稍微扩展的版本(因为上面的内容对我来说不起作用),使用另一个css-modules-typescript-loader从 stale 派生的包( )typings-for-css-modules-loader

如果有人遇到同样的问题 - 这是一个适合我的配置:

TypeScript + WebPack + Sass

webpack.config.js

module.exports = {
  //mode: "production", 
    mode: "development", devtool: "inline-source-map",

    entry: [ "./src/app.tsx"/*main*/ ], 
    output: {
        filename: "./bundle.js"  // in /dist
    },
    resolve: {
        // Add `.ts` and `.tsx` as a resolvable extension.
        extensions: [".ts", ".tsx", ".js", ".css", ".scss"]
    },
    module: {
        rules: [

            { test: /\.tsx?$/, loader: "ts-loader" }, 

            { test: /\.scss$/, use: [ 
                { loader: "style-loader" },  // to inject the result into the DOM as a style block
                { loader: "css-modules-typescript-loader"},  // to generate a .d.ts module next to the .scss file (also requires a declaration.d.ts with "declare modules '*.scss';" in it to tell TypeScript that "import styles from './styles.scss';" means to load the module "./styles.scss.d.td")
                { loader: "css-loader", options: { modules: true } },  // to convert the resulting CSS to Javascript to be bundled (modules:true to rename CSS classes in output to cryptic identifiers, except if wrapped in a :global(...) pseudo class)
                { loader: "sass-loader" },  // to convert SASS to CSS
                // NOTE: The first build after adding/removing/renaming CSS classes fails, since the newly generated .d.ts typescript module is picked up only later
            ] }, 

        ]
    }
}; 
Run Code Online (Sandbox Code Playgroud)

还可以在您的项目中添加一个declarations.d.ts

// We need to tell TypeScript that when we write "import styles from './styles.scss' we mean to load a module (to look for a './styles.scss.d.ts'). 
declare module '*.scss'; 
Run Code Online (Sandbox Code Playgroud)

package.json您将在您的开发依赖项中需要所有这些:

  "devDependencies": {
    "@types/node-sass": "^4.11.0",
    "node-sass": "^4.12.0",
    "css-loader": "^1.0.0",
    "css-modules-typescript-loader": "^2.0.1",
    "sass-loader": "^7.1.0",
    "style-loader": "^0.23.1",
    "ts-loader": "^5.3.3",
    "typescript": "^3.4.4",
    "webpack": "^4.30.0",
    "webpack-cli": "^3.3.0"
  }
Run Code Online (Sandbox Code Playgroud)

mystyle.d.ts然后你应该在你的旁边得到一个mystyle.scss包含你定义的 CSS 类的内容,你可以将其作为 Typescript 模块导入并像这样使用:

import * as styles from './mystyles.scss'; 

const foo = <div className={styles.myClass}>FOO</div>; 
Run Code Online (Sandbox Code Playgroud)

CSS 将自动加载(作为style元素注入到 DOM 中)并包含神秘标识符而不是 .scss 中的 CSS 类,以隔离页面中的样式(除非您使用:global(.a-global-class) { ... })。

请注意,每当您添加 CSS 类、删除它们或重命名它们时,第一次编译都会失败,因为导入的 mystyles.d.ts 是旧版本,而不是编译期间刚刚生成的新版本。重新编译一下就可以了。

享受。