typescript 未能将scss集成到我的汇总版本中

ufj5ltwl  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(159)

我努力实现的目标

我正在尝试创建一个小型库供个人使用-基本上只是将一些代码拆分为lib(产品)和app(项目)代码。
我所有的源代码都保存在/src文件夹中,其中包含React, TypeScript and SCSS代码。如果我可以直接在React中使用SCSS导入,那就太好了,比如:import './_button.scss';
我有另一个SCSS文件:src/style/_main.scss它包括一些mixin,全局样式,重置等。

配置文件

import commonjs from '@rollup/plugin-commonjs';
import json from '@rollup/plugin-json';
import resolve from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
import typescript from '@rollup/plugin-typescript';
import url from '@rollup/plugin-url';
import dts from 'rollup-plugin-dts';
import scss from 'rollup-plugin-scss';
import { format, parse } from 'path';
import pkg from './package.json' assert { type: 'json' };

const getTypesPath = (jsFile) => {
    const pathInfo = parse(jsFile);
    return format({
        ...pathInfo,
        base: '',
        dir: `${pathInfo.dir}/types`,
        ext: '.d.ts',
    });
};

export default [
    {
        input: 'src/index.ts',
        output: [
            {
                file: pkg.main,
                format: 'cjs',
                interop: 'compat',
                exports: 'named',
                sourcemap: true,
                inlineDynamicImports: true,
            },
            {
                file: pkg.module,
                format: 'esm',
                exports: 'named',
                sourcemap: true,
                inlineDynamicImports: true,
            },
        ],
        plugins: [
            resolve({ browser: true }),
            commonjs({ extensions: ['.js', '.jsx', '.ts', '.tsx'] }),
            typescript({ tsconfig: './tsconfig.build.json' }),
            url(),
            scss({
                failOnError: true
            }),
            json(),
            terser(),
        ],
        external: ['react', 'react-dom'],
    },
    {
        input: getTypesPath(pkg.module ?? pkg.main),
        output: [{ file: pkg.types, format: 'esm' }],
        plugins: [dts()],
    },
];

我的tsconfig.build.json如下所示:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./types",
    "declaration": true,
    "declarationDir": "./types",
    "allowSyntheticDefaultImports": true
  }
}

我挣扎的地方

现在的主要问题是,它在定义文件中导入我的SCSS文件,例如button.d.ts看起来像:
一个二个一个一个
这确实是个问题,但我该如何解决呢?
我也得到了错误:

Error:
        @use rules must be written before any other rules.
  ╷
4 │ @use 'src/style/util/mixin';
  │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ╵
  stdin 4:1  root stylesheet

但是这实际上没有多大意义,因为我的_button.scss部分代码在第一行就写了这个。

我的问题

我怎样才能让它工作,以便我可以在我的库中使用SCSS?最好的情况是我不必接触我的原始代码。我只想转换/捆绑它,以便我可以在其他地方使用它。有什么建议吗?

icnyk63a

icnyk63a1#

经过几个小时的探索,我终于让它工作了。
问题是,它捆绑了我所有的sass样式,并且没有考虑到,我正在使用新的@use模块语法。因为所有的东西都被连接到一个大文件中,@use语法被放置在文件的中间,导致了一个错误。显然,只有旧的@import语法才能被rollup-plugin-scss正确支持-或者我只是太没有能力让它工作了。
所以我切换到https://anidetrix.github.io/rollup-plugin-styles/库来处理文件。我所要做的就是使用styles插件,设置mode: 'inject',然后将样式注入到我的[esm|cjs]/index.js文件中。在应用程序中导入库并启动它时,样式就被应用了。
此外,我还必须将从index.d.ts导入的内容外部化。
更新的配置文件:

import commonjs from '@rollup/plugin-commonjs';
import json from '@rollup/plugin-json';
import resolve from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
import typescript from '@rollup/plugin-typescript';
import url from '@rollup/plugin-url';
import { format, parse } from 'path';
import dts from 'rollup-plugin-dts';
import external from 'rollup-plugin-peer-deps-external';
import styles from 'rollup-plugin-styles';
import pkg from './package.json' assert { type: 'json' };

const getTypesPath = (jsFile) => {
    const pathInfo = parse(jsFile);
    return format({
        ...pathInfo,
        base: '',
        dir: `${pathInfo.dir}/types`,
        ext: '.d.ts',
    });
};

export default [
    {
        input: 'src/index.ts',
        output: [
            {
                file: pkg.main,
                format: 'cjs',
                interop: 'compat',
                exports: 'named',
                sourcemap: true,
                inlineDynamicImports: true,
            },
            {
                file: pkg.module,
                format: 'esm',
                exports: 'named',
                sourcemap: true,
                inlineDynamicImports: true,
            },
        ],
        external: ['react', 'react-dom'],
        plugins: [
            external(),
            resolve({
                browser: true,
            }),
            url(),
            styles({
                mode: 'inject'
            }),
            json(),
            commonjs({
                extensions: ['.js', '.jsx', '.ts', '.tsx'],
            }),
            typescript({
                tsconfig: './tsconfig.build.json',
            }),
            terser(),
        ],
    },
    {
        input: getTypesPath(pkg.module ?? pkg.main),
        output: [
            {
                file: pkg.types,
                format: 'esm',
            },
        ],
        external: [/\.(sass|scss|css)$/] /* ignore style files */,
        plugins: [dts()],
    },
];

相关问题