如何在 react 和 typescript npm 包中包含 css 文件
How to Include a css file in react and typescript npm package
我正在创建一系列组件,以便在我工作的公司中重复使用。我们使用打字稿,到目前为止我可以正确地创建组件,转换为 javascript,并发布到 npm。我只使用命令行 tsc
,我没有使用 webpack。我的问题依赖于使用 css 文件的特定组件。当我 运行 安装我的 npm 包的实际应用程序时,它会抛出一个错误:
./~/my-common-components/dist/DataTable.js
Module not found: Can't resolve './DataTable.css' in '.\AdminPortal\admin-portal\node_modules\common-components\dist'
当我查看我的转译代码的 dist 文件夹时,css 文件不存在。
我尝试将 'files' 添加到 tsconfig.json
文件中,它确实添加了它,但路径完全相同(src\DataTable.css
而不是 dist\DataTable.css
)
有没有办法在不使用 webpack 的情况下将该文件包含在最终包中?
我认为您对该文件的路径没有问题。我认为您对该 .css 文件的注册有疑问。你有 BundleConfig.cs 吗?他们的路径在那里?
试试看
import React from 'react';
import s from './Button.css';
function Button() {
return (
<button className={s.btn}><i className={s.icon} />Click Me</button>
);
}
export default Button;
我通常使用 gulp or grunt 之类的工具来准备发布到 npm 的版本。在其他步骤中,这包括将打字稿拖放到 javascript 并将图像、样式表、配置等其他资源复制到目标目录。
下面是 gulp 任务的粗略示例,让您了解上述两个步骤:
gulp.task('copy.assets', () =>
{
return gulp.src(["./**/*", '!./**/*.ts', '!./**/*.tsx', '!./**/*.scss'])
.pipe(gulp.dest(TARGET_FOLDER));
});
gulp.task('build.js', () =>
{
var tsProject = ts.createProject('tsconfig.json', {
typescript: require('typescript')
});
var tsResult = tsProject.src()
.pipe(tsProject());
return tsResult.js
.pipe(gulp.dest(TARGET_FOLDER));
});
请注意 it is not mandatory 使用这些工具中的任何一个。但是想法仍然是一样的——你必须创建你的构建和部署脚本来做一些超出简单转换的事情。
基本上,tsc
旨在编译 .ts
/ .tsx
文件,目前不处理其他文件类型,例如 .css
。这是一个已知问题,已跟踪 here.
要解决此问题,您需要tsc
编译所有 TypeScript 文件,然后复制任何非 TypeScript 文件。 Víctor Colombo 有一个关于复制 .css
个文件 here 的很好的指南。下面列出了这两个步骤:
首先,安装两个有助于复制 overfil 的开发依赖项
npm install --save-dev rimraf copyfiles
然后,更新 package.json
中的“脚本”以在构建包时实现非 TypeScript 文件的复制过程:
"scripts": {
"clean": "rimraf dist/",
"copy-files": "copyfiles -u 1 src/**/*.html src/**/*.css dist/",
"build": "yarn clean && tsc && yarn copy-files"
},
注意:此解决方案假定您使用的是 npm
,尽管您可以像包管理器一样轻松地换成 yarn
。它还假定分发文件存储在 dist
文件夹中。您可以通过 运行 npm run build
检查解决方案是否有效,并检查 dist
.
下的 .css
文件
有一个非常聪明的解决方案,使用一个使用 tsc 挂钩的包:https://github.com/swimauger/tsc-hooks
先安装就可以了:
npm install --save-dev tsc-hooks
然后将这些行添加到您的 tsconfig.json
:
{
...
"hooks": ["copy-files"],
"include": ["src/**/*.tsx", "src/**/*.ts", "src/**/*.css"],
"exclude": ["src/**/*.txt"] /* if you wish to exclude any files */
}
我正在创建一系列组件,以便在我工作的公司中重复使用。我们使用打字稿,到目前为止我可以正确地创建组件,转换为 javascript,并发布到 npm。我只使用命令行 tsc
,我没有使用 webpack。我的问题依赖于使用 css 文件的特定组件。当我 运行 安装我的 npm 包的实际应用程序时,它会抛出一个错误:
./~/my-common-components/dist/DataTable.js
Module not found: Can't resolve './DataTable.css' in '.\AdminPortal\admin-portal\node_modules\common-components\dist'
当我查看我的转译代码的 dist 文件夹时,css 文件不存在。
我尝试将 'files' 添加到 tsconfig.json
文件中,它确实添加了它,但路径完全相同(src\DataTable.css
而不是 dist\DataTable.css
)
有没有办法在不使用 webpack 的情况下将该文件包含在最终包中?
我认为您对该文件的路径没有问题。我认为您对该 .css 文件的注册有疑问。你有 BundleConfig.cs 吗?他们的路径在那里?
试试看
import React from 'react';
import s from './Button.css';
function Button() {
return (
<button className={s.btn}><i className={s.icon} />Click Me</button>
);
}
export default Button;
我通常使用 gulp or grunt 之类的工具来准备发布到 npm 的版本。在其他步骤中,这包括将打字稿拖放到 javascript 并将图像、样式表、配置等其他资源复制到目标目录。
下面是 gulp 任务的粗略示例,让您了解上述两个步骤:
gulp.task('copy.assets', () =>
{
return gulp.src(["./**/*", '!./**/*.ts', '!./**/*.tsx', '!./**/*.scss'])
.pipe(gulp.dest(TARGET_FOLDER));
});
gulp.task('build.js', () =>
{
var tsProject = ts.createProject('tsconfig.json', {
typescript: require('typescript')
});
var tsResult = tsProject.src()
.pipe(tsProject());
return tsResult.js
.pipe(gulp.dest(TARGET_FOLDER));
});
请注意 it is not mandatory 使用这些工具中的任何一个。但是想法仍然是一样的——你必须创建你的构建和部署脚本来做一些超出简单转换的事情。
基本上,tsc
旨在编译 .ts
/ .tsx
文件,目前不处理其他文件类型,例如 .css
。这是一个已知问题,已跟踪 here.
要解决此问题,您需要tsc
编译所有 TypeScript 文件,然后复制任何非 TypeScript 文件。 Víctor Colombo 有一个关于复制 .css
个文件 here 的很好的指南。下面列出了这两个步骤:
首先,安装两个有助于复制 overfil 的开发依赖项
npm install --save-dev rimraf copyfiles
然后,更新 package.json
中的“脚本”以在构建包时实现非 TypeScript 文件的复制过程:
"scripts": {
"clean": "rimraf dist/",
"copy-files": "copyfiles -u 1 src/**/*.html src/**/*.css dist/",
"build": "yarn clean && tsc && yarn copy-files"
},
注意:此解决方案假定您使用的是 npm
,尽管您可以像包管理器一样轻松地换成 yarn
。它还假定分发文件存储在 dist
文件夹中。您可以通过 运行 npm run build
检查解决方案是否有效,并检查 dist
.
.css
文件
有一个非常聪明的解决方案,使用一个使用 tsc 挂钩的包:https://github.com/swimauger/tsc-hooks
先安装就可以了:
npm install --save-dev tsc-hooks
然后将这些行添加到您的 tsconfig.json
:
{
...
"hooks": ["copy-files"],
"include": ["src/**/*.tsx", "src/**/*.ts", "src/**/*.css"],
"exclude": ["src/**/*.txt"] /* if you wish to exclude any files */
}