在带样式的组件中使用 Ant Design 变量
Using Ant Design Variables in Styled Components
我在带样式的组件中使用 Ant Design in conjunction with Styled Components inside of a GatsbyJS site. I would like to be able to access the Ant Design variables (which are written in Less)。像这样:
const StyledButton = styled(Button)`
background-color: @primary-color
`
我做了一些研究,发现了两个可能会有所帮助的库,但我不知道如何让它们工作(至少在 Gatsby 设置中没有)。这些是库:
Styless
包中有一个如何让 Less 变量在 Styled Compoments 中工作的示例:https://github.com/jean343/styless/blob/master/examples/Theme.js。
但是,我无法让该示例在我的 Gatsby 站点上运行——无论我是否尝试在 gatsby-ssr.js
或 gatsby-browser.js
中的基本布局组件上实现它。
所以,我想知道——有没有一种方法能够访问 GatsbyJS 站点中样式化组件内的 Less 变量(无论是否使用这些库)?如果是,怎么做?
谢谢。
当你使用 Gatsby 时,你可以使用加载器,在这种情况下你可以使用 "less-vars-loader!antd/lib/style/themes/default.less"
获取变量名
这对于没有变量的简单 less 工作表可以很好地工作,但这对 Antd 来说效果不佳,因为它们设置了一个变量 @primary-color: @blue-6;
。
import React from "react"
import { Button } from 'antd';
import styled, { ThemeProvider } from "styled-components"
import Layout from "../components/layout"
import DefaultTheme from "less-vars-loader!antd/lib/style/themes/default.less"
import "antd/dist/antd.css";
const StyledButton = styled( Button )`
background-color: @primary-color;
`;
const App = () => (
<Layout>
<StyledButton>Hi people</StyledButton>
</Layout>
);
console.log( "DefaultTheme", DefaultTheme["primary-color"] ); // Here, this shows @blue-6
DefaultTheme["primary-color"] = "blue"; // For demo purpose, setting the value here.
export default () => (
<ThemeProvider theme={DefaultTheme}><App/></ThemeProvider>
);
正如承诺的那样,我正在添加示例 webpack 加载器来解析 antd 变量。它确实解决了大约 600 个变量,但仍然失败并显示 "JavaScript evaluation error: 'ReferenceError: colorPalette is not defined'"
。这对于不需要 javascriptEnabled
.
的项目很有用
const less = require( "less" );
const varRgx = /^[@$]/;
module.exports = async source => {
const resolveVariables = async () => {
const root = await new Promise( resolve => {
const parseOpts = {
javascriptEnabled: true,
paths: ["node_modules/antd/lib/style/themes/"],
};
less.parse( source, parseOpts, ( e, root, imports, options ) => {
if( e ){
console.error( `LESSLoader - Error compiling`, e );
}
resolve( root );
} );
} );
if( !root ) return;
const evalEnv = new less.contexts.Eval();
evalEnv.frames = [root];
evalEnv.javascriptEnabled = true;
const ret = {};
for( let [name, variable] of Object.entries( root.variables() ) ){
ret[name.replace( varRgx, "" )] = variable.value.eval( evalEnv ).toCSS();
}
return ret;
};
return `module.exports = ${JSON.stringify( await resolveVariables() )};`;
};
可以用import DefaultTheme from "./LESSLoader!antd/lib/style/themes/default.less"
调用。
如果您只想在 Styled Components 中获取 Antd 变量名称,则可以改用 styless
的 import
选项。这样就简单多了,不需要解析任何变量。
在您的 .babelrc
中,使用此代码导入样式。
{
"plugins": [
[
"styless",
{
"import": "~antd/lib/style/themes/default.less",
"lessOptions": {
"javascriptEnabled": true
}
}
]
]
}
那么,所有的客户端代码都可以简化为:
import React from "react"
import { Button } from 'antd';
import styled from "styled-components"
import "antd/dist/antd.css";
const StyledButton = styled( Button )`
background-color: @primary-color;
`;
export default () => {
return <StyledButton>button</StyledButton>
}
不要忘记删除 .cache
文件夹以使效果发生。
我在带样式的组件中使用 Ant Design in conjunction with Styled Components inside of a GatsbyJS site. I would like to be able to access the Ant Design variables (which are written in Less)。像这样:
const StyledButton = styled(Button)`
background-color: @primary-color
`
我做了一些研究,发现了两个可能会有所帮助的库,但我不知道如何让它们工作(至少在 Gatsby 设置中没有)。这些是库:
Styless
包中有一个如何让 Less 变量在 Styled Compoments 中工作的示例:https://github.com/jean343/styless/blob/master/examples/Theme.js。
但是,我无法让该示例在我的 Gatsby 站点上运行——无论我是否尝试在 gatsby-ssr.js
或 gatsby-browser.js
中的基本布局组件上实现它。
所以,我想知道——有没有一种方法能够访问 GatsbyJS 站点中样式化组件内的 Less 变量(无论是否使用这些库)?如果是,怎么做?
谢谢。
当你使用 Gatsby 时,你可以使用加载器,在这种情况下你可以使用 "less-vars-loader!antd/lib/style/themes/default.less"
这对于没有变量的简单 less 工作表可以很好地工作,但这对 Antd 来说效果不佳,因为它们设置了一个变量 @primary-color: @blue-6;
。
import React from "react"
import { Button } from 'antd';
import styled, { ThemeProvider } from "styled-components"
import Layout from "../components/layout"
import DefaultTheme from "less-vars-loader!antd/lib/style/themes/default.less"
import "antd/dist/antd.css";
const StyledButton = styled( Button )`
background-color: @primary-color;
`;
const App = () => (
<Layout>
<StyledButton>Hi people</StyledButton>
</Layout>
);
console.log( "DefaultTheme", DefaultTheme["primary-color"] ); // Here, this shows @blue-6
DefaultTheme["primary-color"] = "blue"; // For demo purpose, setting the value here.
export default () => (
<ThemeProvider theme={DefaultTheme}><App/></ThemeProvider>
);
正如承诺的那样,我正在添加示例 webpack 加载器来解析 antd 变量。它确实解决了大约 600 个变量,但仍然失败并显示 "JavaScript evaluation error: 'ReferenceError: colorPalette is not defined'"
。这对于不需要 javascriptEnabled
.
const less = require( "less" );
const varRgx = /^[@$]/;
module.exports = async source => {
const resolveVariables = async () => {
const root = await new Promise( resolve => {
const parseOpts = {
javascriptEnabled: true,
paths: ["node_modules/antd/lib/style/themes/"],
};
less.parse( source, parseOpts, ( e, root, imports, options ) => {
if( e ){
console.error( `LESSLoader - Error compiling`, e );
}
resolve( root );
} );
} );
if( !root ) return;
const evalEnv = new less.contexts.Eval();
evalEnv.frames = [root];
evalEnv.javascriptEnabled = true;
const ret = {};
for( let [name, variable] of Object.entries( root.variables() ) ){
ret[name.replace( varRgx, "" )] = variable.value.eval( evalEnv ).toCSS();
}
return ret;
};
return `module.exports = ${JSON.stringify( await resolveVariables() )};`;
};
可以用import DefaultTheme from "./LESSLoader!antd/lib/style/themes/default.less"
调用。
如果您只想在 Styled Components 中获取 Antd 变量名称,则可以改用 styless
的 import
选项。这样就简单多了,不需要解析任何变量。
在您的 .babelrc
中,使用此代码导入样式。
{
"plugins": [
[
"styless",
{
"import": "~antd/lib/style/themes/default.less",
"lessOptions": {
"javascriptEnabled": true
}
}
]
]
}
那么,所有的客户端代码都可以简化为:
import React from "react"
import { Button } from 'antd';
import styled from "styled-components"
import "antd/dist/antd.css";
const StyledButton = styled( Button )`
background-color: @primary-color;
`;
export default () => {
return <StyledButton>button</StyledButton>
}
不要忘记删除 .cache
文件夹以使效果发生。