使用 webpack 构建的 Typescript 在 React 组件中使用 CSS 个模块
Use CSS Modules in React components with Typescript built by webpack
我想在用 Typescript 编写的 React 应用程序中使用 css-loader 和 webpack 的 'modules' 选项。 This example 是我的起点(他们正在使用 Babel、webpack 和 React)。
webpack 配置
var webpack=require('webpack');
var path=require('path');
var ExtractTextPlugin=require("extract-text-webpack-plugin");
module.exports={
entry: ['./src/main.tsx'],
output: {
path: path.resolve(__dirname, "target"),
publicPath: "/assets/",
filename: 'bundle.js'
},
debug: true,
devtool: 'eval-source-map',
plugins: [
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin({minimize: true})
],
resolve: {
extensions: ['', '.jsx', '.ts', '.js', '.tsx', '.css', '.less']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'ts-loader'
},
{
test: /\.tsx$/,
loader: 'react-hot!ts-loader'
}, {
test: /\.jsx$/,
exclude: /(node_modules|bower_components)/,
loader: "react-hot!babel-loader"
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: "babel-loader"
}, {
test: /\.css/,
exclude: /(node_modules|bower_components)/,
loader: ExtractTextPlugin.extract('style-loader', 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader')
}
]
},
plugins: [
new ExtractTextPlugin("styles.css", {allChunks: true})
],
postcss: function() {
return [require("postcss-cssnext")()]
}
}
这是一个 React 组件,我想使用附带的 CSS 文件设置样式:
import React = require('react');
import styles = require('../../../css/tree.css')
class Tree extends React.Component<{}, TreeState> {
...
render() {
var components = this.state.components
return (
<div>
<h3 className={styles.h3} >Components</h3>
<div id="tree" className="list-group">
...
</div>
</div>
)
}
}
export = Tree
tree.css
.h3{
color: red;
}
无论我在做什么(尝试更改导入语法,尝试为 ts-loader 声明 'require',如 here 所述,我总是得到:
Uncaught Error: Cannot find module "../../../css/tree.css"
在运行时和
error TS2307: Cannot find module '../../../css/tree.css'.
由 TS 编译器。发生了什么?在我看来 css-loader 甚至没有发射 ICSS?还是 ts-loader 行为不对?
我有类似的问题。
对我来说,作品导入:
import '../../../css/tree.css';
Webpack 像任何其他正常导入一样更改此设置。它将其更改为
__webpack_require__(id)
一个缺点是您失去了对样式变量的控制。
import
对 TypeScript 有特殊意义。这意味着 TypeScript 将尝试加载和理解正在导入的内容。正确的方法是像你提到的那样定义 require
但然后 var
而不是 import
:
var styles = require('../../../css/tree.css')`
- 根据ts-loader documentation声明'require'。
- 使用 'require' 作为泛型 < any > 类型:require< any >("../../../css/tree.css").
*.d.ts 文件
declare var require: {
<T>(path: string): T;
(paths: string[], callback: (...modules: any[]) => void): void;
ensure: (paths: string[], callback: (require: <T>(path: string) => T) => void) => void;
};
*.tsx 文件与组件
const styles = require<any>("../../../css/tree.css");
...
<h3 className={styles.h3}>Components</h3>
我知道已经有人回答了,但在我意识到我需要使用泛型类型规范之前我苦苦思索了一段时间,否则我无法访问 CSS 文件的内容。 (我收到错误消息:属性 'h3' 在类型“{}”上不存在。)
您可以使用https://github.com/Quramy/typed-css-modules, which creates .d.ts files from CSS Modules .css files. Please see also https://github.com/css-modules/css-modules/issues/61#issuecomment-220684795
游戏有点晚了,但您可以在与 tree.css 相同的文件夹中创建一个名为 tree.css.d.ts 的文件,其中包含以下行:
export const h3: string;
并且仍然使用导入语句import * as styles from ...
,您仍然会得到代码完成和编译时检查。
您可以手动管理这些定义文件,也可以将 typed-css-modules 集成到您的构建管道中 (https://github.com/Quramy/typed-css-modules)
我想在用 Typescript 编写的 React 应用程序中使用 css-loader 和 webpack 的 'modules' 选项。 This example 是我的起点(他们正在使用 Babel、webpack 和 React)。
webpack 配置
var webpack=require('webpack');
var path=require('path');
var ExtractTextPlugin=require("extract-text-webpack-plugin");
module.exports={
entry: ['./src/main.tsx'],
output: {
path: path.resolve(__dirname, "target"),
publicPath: "/assets/",
filename: 'bundle.js'
},
debug: true,
devtool: 'eval-source-map',
plugins: [
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin({minimize: true})
],
resolve: {
extensions: ['', '.jsx', '.ts', '.js', '.tsx', '.css', '.less']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'ts-loader'
},
{
test: /\.tsx$/,
loader: 'react-hot!ts-loader'
}, {
test: /\.jsx$/,
exclude: /(node_modules|bower_components)/,
loader: "react-hot!babel-loader"
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: "babel-loader"
}, {
test: /\.css/,
exclude: /(node_modules|bower_components)/,
loader: ExtractTextPlugin.extract('style-loader', 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader')
}
]
},
plugins: [
new ExtractTextPlugin("styles.css", {allChunks: true})
],
postcss: function() {
return [require("postcss-cssnext")()]
}
}
这是一个 React 组件,我想使用附带的 CSS 文件设置样式:
import React = require('react');
import styles = require('../../../css/tree.css')
class Tree extends React.Component<{}, TreeState> {
...
render() {
var components = this.state.components
return (
<div>
<h3 className={styles.h3} >Components</h3>
<div id="tree" className="list-group">
...
</div>
</div>
)
}
}
export = Tree
tree.css
.h3{
color: red;
}
无论我在做什么(尝试更改导入语法,尝试为 ts-loader 声明 'require',如 here 所述,我总是得到:
Uncaught Error: Cannot find module "../../../css/tree.css"
在运行时和
error TS2307: Cannot find module '../../../css/tree.css'.
由 TS 编译器。发生了什么?在我看来 css-loader 甚至没有发射 ICSS?还是 ts-loader 行为不对?
我有类似的问题。 对我来说,作品导入:
import '../../../css/tree.css';
Webpack 像任何其他正常导入一样更改此设置。它将其更改为
__webpack_require__(id)
一个缺点是您失去了对样式变量的控制。
import
对 TypeScript 有特殊意义。这意味着 TypeScript 将尝试加载和理解正在导入的内容。正确的方法是像你提到的那样定义 require
但然后 var
而不是 import
:
var styles = require('../../../css/tree.css')`
- 根据ts-loader documentation声明'require'。
- 使用 'require' 作为泛型 < any > 类型:require< any >("../../../css/tree.css").
*.d.ts 文件
declare var require: {
<T>(path: string): T;
(paths: string[], callback: (...modules: any[]) => void): void;
ensure: (paths: string[], callback: (require: <T>(path: string) => T) => void) => void;
};
*.tsx 文件与组件
const styles = require<any>("../../../css/tree.css");
...
<h3 className={styles.h3}>Components</h3>
我知道已经有人回答了,但在我意识到我需要使用泛型类型规范之前我苦苦思索了一段时间,否则我无法访问 CSS 文件的内容。 (我收到错误消息:属性 'h3' 在类型“{}”上不存在。)
您可以使用https://github.com/Quramy/typed-css-modules, which creates .d.ts files from CSS Modules .css files. Please see also https://github.com/css-modules/css-modules/issues/61#issuecomment-220684795
游戏有点晚了,但您可以在与 tree.css 相同的文件夹中创建一个名为 tree.css.d.ts 的文件,其中包含以下行:
export const h3: string;
并且仍然使用导入语句import * as styles from ...
,您仍然会得到代码完成和编译时检查。
您可以手动管理这些定义文件,也可以将 typed-css-modules 集成到您的构建管道中 (https://github.com/Quramy/typed-css-modules)