我努力实现的目标
我正在尝试创建一个小型库供个人使用-基本上只是将一些代码拆分为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?最好的情况是我不必接触我的原始代码。我只想转换/捆绑它,以便我可以在其他地方使用它。有什么建议吗?
1条答案
按热度按时间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
导入的内容外部化。更新的配置文件: