3.9.0
webpack4
https://zlab.github.io/report.html
์นํฉ ๋น๋
icon ๆ้ ๆๅ , js ๆไปถ ๆๅ
ๆๅ ๅฐ ์ฒญํฌ ๋ฒค๋ ้ๅป ไบ
IssueHunt ์์ฝ
IssueHunt๋ ๋ค์ ์คํฐ์์ ์ง์์ ๋ฐ์์ต๋๋ค. ์คํฐ์๋๊ธฐ
์ด ๋ฌธ์ ์ ๋ฒ์ญ :
3.9.0
Webpack4
https://zlab.github.io/report.html
Webpack ๋น๋
ํ์์ ๋ฐ๋ผ ์์ด์ฝ ํฉ, js ํ์ผ ๋ถํ
์ฒญํฌ ๋ฒค๋๋ก ํฌ์ฅ
<Icon />
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์
ํฉ๋๋ค. ๋ฐํ์์ ์ด๋ค ์ข
๋ฅ์ ์์ด์ฝ์ ๋์
ํ ์ง ๋ชจ๋ฅด๊ฒ ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด์ ์๋ ์์ด์ฝ์ด iconfont.cn
ํธ์คํ
๋์์ผ๋ฏ๋ก ํฌ์ฅ์ ๋ํ ์ธ์์ด ์์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ ์์ ๊ณํ์ ๋ํ ์ฌ์ธต์ ์ธ ๋ ผ์๊ฐ ํ์ํฉ๋๋ค. https://github.com/ant-design/ant-design/issues/12011#issuecomment -420038579 ์ฐธ์กฐ
cc @yesmeck
์์ฒญ์๋ก๋ ํ ์์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผํ๋ฉฐ์ด ๋ฉ์๋๋ antd ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ ์ฌ์ฉ๋ฉ๋๋ค.
import Star from 'antd/icons/star';
<Star />
ํ์ง๋ง ์ด๋ ๊ฒํ๋ฉด ์ด์ ๊ธ์ด ํธํ๋์ง ์์ต๋๋ค.
<Icon type="star" /> // should import star icon first
ํ์์ ๋ฐ๋ผ ํจํค์ง ํ ์ ์์ผ๋ฉฐ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋ํ๋ ๊ฒ๋ ์ข์ต๋๋ค.
iconfont๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํ์ด์ง ์ฝํ ์ธ ๊ฐ ๋จผ์ ๋์ค๊ณ ์์ด์ฝ์ด ๋๋ฆฌ๊ฒ๋ก๋๋ฉ๋๋ค.
<Icon.Star />
ํ์ง๋ง ์ด๋ ๊ฒํ๋ฉด ์ด์ ๊ธ์ด ํธํ๋์ง ์์ต๋๋ค.
์๋์, <Icon />
๊ฐ ํ์ํ์ง ์์ ํ ๋ชจ๋ ๊ฒ์ ํฌ์ฅ ํ ์ ์์ต๋๋ค.
๋ฉ๋ด ์์ด์ฝ ์ค์ ๊ณผ ๊ฐ์ ์ผ๋ถ ์ฅ๋ฉด์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ตฌ์ฑ ํ ์์๋ ๊ฒฝ์ฐ ํ์์ ๋ฐ๋ผ ํจํค์งํ ํ ์ ์์ผ๋ฏ๋ก ํ๋ฐํธ ์๋๋ ์ด๋ค ์์ด์ฝ์ด ์ค์ ๋ ์ง ์์ธกํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ๋ก๋ฉ์ด ๋ ์ ํฉํฉ๋๋ค. @ ant-design / icons๋ฅผ ๋ฉ์ด๋ฆฌ์ ๋ฃ์ผ์ญ์์ค.
์ค์ ๋ก <DatePicker />
, <Select />
๋ฑ๊ณผ ๊ฐ์ด <Icon />
๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ๊ณต ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์ ์์ ํ ๋์
๋ฉ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ตฌ์ฑ ํ ์์๋ ๊ฒฝ์ฐ ํ๋ฐํธ ์๋๋ ์ค์ ๋ ์์ด์ฝ์ ์์ธกํ ์ ์์ต๋๋ค. ๋น๋๊ธฐ๋ก๋๊ฐ ๋ ์ ํฉํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฐฑ์๋ ์์คํ ์ ๋ฉ๋ด๊ฐ ๊ตฌ์ฑ๋์์ต๋๋ค. ์์ด์ฝ์ ๋น๋๊ธฐ ๋ก๋ฉ์ด ์ ๋ง ํ์ํ๊ณ ์ ์ฒด ํจํค์ง๊ฐ ๋๋ฌด ํฝ๋๋ค.
๋น๋๊ธฐ๊ฐ ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฃผ๋ฌธํ์ผ๋ก ํจํค์งํ๋ ค๋ ๊ฒฝ์ฐ babel-plugin-import
์ ๊ฐ์ babel
ํ๋ฌ๊ทธ์ธ์ ์์ฑํด์ผํฉ๋๋ค.
์ค์ ๋ก
<DatePicker />
,<Select />
๋ฑ๊ณผ ๊ฐ์ด<Icon />
๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ๊ณต ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์ ์์ ํ ๋์ ๋ฉ๋๋ค.
๋ด๋ถ ์ฐ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋จ
ํ๋ก์ ํธ์์ ํ์
์ ๋ณ์์ธ๋ฐ ์ ์ก ๋ง ์๊ฐํด๋ ๋๋์?
<Icon type={icon} />
๋ถ๋ถ์ ์ผ๋ก ๋์
ํ ์ ์์ต๋๊น?
svg ์ฌ๋ณผ ์คํ๋ผ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ ํ ์ ์ฒด ํจํค์ง์ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์๋์ง ํ์ธํ์ญ์์ค.
https://github.com/jkphl/svg-sprite
https://css-tricks.com/svg-symbol-good-choice-icons/
https://css-tricks.com/pretty-good-svg-icon-system/
๋ํ dist ํจํค์ง๋ @ant-design/icons
์์ ์ง์ ๋น๋ํด์ผํ๋ฉฐ ๊ฐ๋ณ๊ฒ ์ปดํ์ผ ๋ ์์ค ์ฝ๋์ ์ง์ ์์กด ํ ํ์๊ฐ ์์ต๋๋ค.
+1, ํจํค์ง๋ ์ค์ ๋ก ๋ ๋ฐฐ์ ๋๋ค
๐ข ๋ํต. . . . ์ผ์ด. . .
๊ฐ์ฅ ์ฐฝํผํ ๊ฒ์ SourceMappingUrl์ ๋ง์ด ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๋๋ค.
3.8.2 ๋ฒ์ ์ผ๋ก ๋์ ๊ฐ๊ฒ ๋ง๋ค์์ต๋๋ค.
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo(umi ํ๋ก์ ํธ)
๋ค์์ webpack์์ resolve.alias
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์๋ฃจ์
์
๋๋ค.
์์ผ๋ก ํ์ํ ์์ด์ฝ์ ๊ฐ์ ธ์ฌ ์์๋ ์๋ก์ด API๋ฅผ ์ค๊ณ ํ ๊ณํ์
๋๋ค.
loading
, close-circle
๋ฑ๊ณผ ๊ฐ์ด loading
antd
๊ตฌ์ฑ ์์์ ์ฌ์ฉ ๋ ์์ด์ฝ๋ ๊ฐ์ ธ์์ผํฉ๋๋ค.
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo(umi ํ๋ก์ ํธ)
์์ ํด๊ฒฐ์ฑ
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. webpack์ resolve.alias
ํ๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์์ผ๋ก๋ ํ์์ ๋ฐ๋ผ ๋ก๋ฉ ์์ด์ฝ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์๋ก์ด ์์ด์ฝ API๋ฅผ ๋์์ธํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํฉ๋๋ค.
์์ฒญ์ ์์ด์ฝ์๋ loading
, close-circle
๋ฑ๊ณผ ๊ฐ์ antd
์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉํ๋ ์์ด์ฝ๋ ํฌํจ๋์ด์ผํฉ๋๋ค.
@HeskeyBaozi ์ฐ์ ์ด์ฌํ ๋
ธ๋ ฅํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ๋ด ํ์ฌ ์๊ฐ์ 9:29
์ด๊ณ ์ ์ถ ํ ์๊ฐ์ 6 hours ago
. ํ์ ๋ค์ ์ ๋ง ์ด์ฌํํฉ๋๋ค! ์ข์์ : thumbsup :: thumbsup :: thumbsup :
๋ด ์ดํด๋ antd์์ ์ฌ์ฉํ๋ ์์ด์ฝ์ ํฌํจํ์ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์์ด์ฝ์ ๋ณ๋๋ก ๋์ดํ๋ ๊ฒ์ ๋๋ค.
@ ant-design / icons / lib / dist.js ํ์ผ์ .
@ChiaJune antd
๊ตฌ์ฑ ์์์ ์ฌ์ฉ ๋ ์ ์ฒด ์์ด์ฝ ๋ชฉ๋ก์
๋๋ค. ๋๋ฝ ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo/blob/master/src/icons.js#L10 -L100
fontawsome์ ์ ๊ทผ ๋ฐฉ์์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
ใ
import { library } from "@fortawesome/fontawesome-svg-core";
import faCalendar from "@fortawesome/free-solid-svg-icons/faCalendar";
library.add(faCalendar); // Load icon once
...
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
<FontAwesomeIcon icon="calendar" />
๋น
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import faCalendar from "@fortawesome/free-solid-svg-icons/faCalendar";
<FontAwesomeIcon icon={faCalendar} /> // Import directly or any svg
์ด์ ์ฌ์ฉ๋์ ์ ์งํ๊ณ ์ฝ์์ ๊ฒฝ๊ณ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํฉ๋๋ค.
import { Icon } from 'antd';
<Icon type="star" />
๋ค์๊ณผ ๊ฐ์ ๊ณต๊ธ์ ์ API :
import Star from 'antd/icons/Star';
import Setting as SettingIcon from 'antd/icons/Setting';
<Star />
<SettingIcon />
ํธ๋ฆฌ ์์ดํน๋ ๊ฐ๋ฅํฉ๋๋ค.
import { Icon: { Star, Setting } } from 'antd';
<Star />
<SettingIcon />
ํธ์ ๋ด์ ๊ฐ๊ธฐ
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo(umi ํ๋ก์ ํธ)
๋ค์์ webpack์์
resolve.alias
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์๋ฃจ์ ์ ๋๋ค.
์์ผ๋ก ํ์ํ ์์ด์ฝ์ ๊ฐ์ ธ์ฌ ์์๋ ์๋ก์ด API๋ฅผ ์ค๊ณ ํ ๊ณํ์ ๋๋ค.
loading
,close-circle
๋ฑ๊ณผ ๊ฐ์ดloading
antd
๊ตฌ์ฑ ์์์ ์ฌ์ฉ ๋ ์์ด์ฝ๋ ๊ฐ์ ธ์์ผํฉ๋๋ค.https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo(umi ํ๋ก์ ํธ)
์์ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. webpack์resolve.alias
ํ๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์์ผ๋ก๋ ํ์์ ๋ฐ๋ผ ๋ก๋ฉ ์์ด์ฝ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์๋ก์ด ์์ด์ฝ API๋ฅผ ๋์์ธํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํฉ๋๋ค.
์์ฒญ์ ์์ด์ฝ์๋loading
,close-circle
๋ฑ๊ณผ ๊ฐ์antd
์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉํ๋ ์์ด์ฝ๋ ํฌํจ๋์ด์ผํฉ๋๋ค.
@HeskeyBaozi ํ๋ฅญํ ์๋ฃจ์ !! (antd๊ฐ์ด ๋ฌธ์ ๋ฅผ ์ ๋ฆฌํ๊ณ ์์ด์ฝ์ ๋จ์ผ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ํ์ฉ ํ ๋๊น์ง) ์ ๋ resolve.alias๋ฅผ ์ฌ์ฉํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํด ์์ง๋ง ์ด๋ก ์ธํด ๋จธ๋ฆฌ๊ฐ ๊ณค๋๋ฐ์ง ์ณค์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์ด ๋ฒ์ ๋ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ณ์ ์ฃผ์ํ์ญ์์ค.
cc @jameswhf @xcqwan
์ ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ณ๋๋ก ๊ฐ์ ธ ์ค๊ธฐ๋ ๋ชจ๋ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ํฌํจํ์ง ์์ผ๋ฏ๋ก ํธ๋ฆฌ ์์ดํน์ ์์ ํด์ผํฉ๋๋ค. ์ฌ๊ธฐ์์ ํ์ธ
๋ฟก ๋นต๋จ
๋๋ webpack.alias๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ์๋ง๋ ๋น์ ์ ๋์ธ ์ ์์ต๋๋ค :)
๋ด repo์ antd-icon-tree-shaking ๋ธ๋์น (Webpack4 + Babel 7.0)
์ด๊ฒ์ ๋ํ ๋ด๊ฐ ๊ฐ์ง ๋ชจ๋ ๊ฒ์ด ๋ฒ๋ค์ Button
๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผ ํต๋๋ค (์๋ง ์์ด์ฝ์ ์ง์ํ๊ธฐ ๋๋ฌธ์). ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒ์ด Button
๊ฒฝ์ฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
(์คํฌ๋ฆฐ ์ท์๋ Button
๊ตฌ์ฑ ์์ ๋ง ์์ง๋ง ์์ด์ฝ์ ์ฃผ๋ก ๋ฒ๋ค์ ๋ถํ๋ฆฝ๋๋ค.)
์์ ๋ ๋๊น์ง ๋๋ฅผ ์ํด ์ผํ ์์ ์๋ฃจ์ (antd> = 3.9)
module.exports = {
//...
resolve: {
alias: {
"@ant-design/icons/lib/dist$": path.resolve(__dirname, "./src/icons.js")
}
}
};
icons.js
ํด๋์ src/
์ด๋๋ ์ง ์ํ๋. ๋ณ์นญ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค!export {
default as DownOutline
} from "@ant-design/icons/lib/outline/DownOutline";
config-overwrites.js
๋ด์์ react-app-rewire
(create-react-app ์์ )์ผ๋ก์ด ์์
์ ์ํ ํ ์๋ ์์ต๋๋ค.
ํ์ํ ์์ด์ฝ ๋ง ๊ฐ์ ธ ์์ ๋ฒํผ์ ์ ๋ฌํ ์์๋ ๋ฐฉ์์ผ๋ก JSX๋ฅผ ์ ๋ฌํ์ฌ ์์ด์ฝ์ ์ค์ ํ ์ ์๋ค๋ฉด ๋ ๋์ API๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ํ์ฌ ์์ด์ฝ (๋๋ ๋ชจ๋ svg)์ผ๋ก ์์ ํ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค.
<Button icon={<Icon type="search" />}>Search</Button>
๋ด ๊ฐ์ธ์ ์ธ ์ทจํฅ :)
react-app-rewired ๋ฅผ ํตํด create-react-app ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์
config-overrides.js
const path = require('path');
/* config-overrides.js */
module.exports = function override (config, env) {
let alias = (config.resolve.alias || {});
alias['@ant-design/icons/lib/dist$'] = path.resolve(__dirname, "./src/icons.js");
config.resolve.alias = alias;
return config;
}
icons.js
์์
react-app-rewired ๋ฅผ ํตํด create-react-app ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์
config-overrides.js
const path = require('path'); /* config-overrides.js */ module.exports = function override (config, env) { let alias = (config.resolve.alias || {}); alias['@ant-design/icons/lib/dist$'] = path.resolve(__dirname, "./src/icons.js"); config.resolve.alias = alias; return config; }
icons.js
์์
์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด twoToneColor์ ํธํ์ฑ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
<Icon type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
<Icon type="close-circle" theme="twoTone" twoToneColor="#f73131" />
๊ฒฐ๊ณผ :
์๋
ํ์ธ์,
์ด ๋ฌธ์ ์ ์์ธ์ <Icon type="check-circle"
์ ๊ฐ์ ์์ด์ฝ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด API๋ ๋ชจ๋ ์์ด์ฝ์ด ํฌํจ๋์ด์ผํ๋ฏ๋ก ์ ํ์ผ๋ก ์ ๊ณตํ๋ ๋ชจ๋ ๊ฒ์ ์ ๊ณต ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์ฐ๋ฆฌ์๊ฒ ๋ฐํ์์ ์์ด์ฝ์ ๊ฒฐ์ ํ ์์๋ ๋ฅ๋ ฅ์ ์ ๊ณตํ๋ฉฐ ์ ์๊ฒ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋์ ๋ฐ๋ฅด๋ฉด API๋ ๋์ผํ๊ฒ ์ ์ง๋์ด์ผํ์ง๋ง ์์ด์ฝ ๊ตฌ์ฑ ์์๋ ์์ฒญ์ ์ง์ ๋ ์ ํ ์ผ๋ก ์์ด์ฝ์๋ก๋ํ๋ ๊ฒ์ ์ง์ํด์ผํฉ๋๋ค.
๋์ ๊ฐ์ ธ ์ค๊ธฐ (# 12235-Webpack 4๋ก ์ ๊ทธ๋ ์ด๋์ ๋ฐ๋ผ ๋ค๋ฆ)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ react-loadable ๊ณผ ๊ฐ์ Webpack 3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด
์ด ์๊ฒฌ์ ๋ฐํ์ผ๋ก ์ถ๊ฐ ์์ ์๋ฃจ์ ์ผ๋ก ์ด๋ํ์ญ์์ค.
$ yarn add purched-antd-icons
// webpack.config.js
module.exports = {
// other configs
resolve:{
// other configs
alias:{
"@ant-design/icons":"purched-antd-icons"
}
}
}
purched-antd-icons ํจํค์ง๋ antd์ ๊ณต์ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉ๋์ง ์์ ๋ชจ๋ ์์ด์ฝ์ ์ ๊ฑฐํฉ๋๋ค. ๋ด ์ํ์ ๋ฐ๋ผ Icomoon ์ ํ๋ก์ ํธ ์์ด์ฝ ์์คํ ๊ณต๊ธ์์ ๋๋ค.
๋ค์์ ๋ฐฐ์ถ ๋ ์์ฑ-๋ฐ์-์ฑ ๋ฒ๋ค ๋ถ์ ๋น๊ต์ ๋๋ค.
์นํฉ ์ถ๋ ฅ
๋ฒ๋ค ๋ถ์
ํด๊ฒฐ ๋ฐฉ๋ฒ @tobiaslins์์ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค, ๊ทธ๊ฒ์ ๋งํ๋ค Module not found: Error: Can't resolve '@ant-design/icons/lib/dist' in '/Users/fede/Projects/despe/deliveries/node_modules/antd/es/icon'
์บ ๋๊ตฌ ํฌ์ธํธ ๋ ๊ทธ๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ? ๊ฐ์ฌ
@marcosfede ๋๋
path.resolve(__dirname, "./src/icons.js")
__dirname
์ค์ ๋์ด ์๋์ง ํ์ธ
react-app-rewired ๋์์ ํตํด create-react-app์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.
3.9 ์ ๊ทธ๋ ์ด๋๋ก ๋ฒ๋ค 700kb ์ฆ๊ฐ (23 %). ์๋ก์ด ๊ตฌํ์ด ๋ง์์ ๋ค์ง๋ง ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ๋์ด๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ด์์ต๋๋ค. ์ฆ๊ฐ๋ 'iconfont'๋ฅผ ํฌํจํ์ง ์๊ธฐ ๋๋ฌธ์ ์์๋ฉ๋๋ค. @Obooman ์๋ฃจ์ ์ ๊ตฌํํ ๋ถ์ ๋งํผ ์ถฉ๋ถํ์ง๋ ์์ต๋๋ค.
purched-antd-icons ํจํค์ง ๊ตฌํ์ผ๋ก ์ธํด ํ๋ก์ ํธ์ ๋ง์ ๋๋ฝ ๋ ์์ด์ฝ์ด ๋จ์ต๋๋ค.
@michaelpeterlee purched-antd-icons
๋ ๊ณต์ ๊ตฌ์ฑ ์์์ ํ์ํ ์์ด์ฝ ๋ง ์ ๊ณตํ๋ฉฐ antd์์ ๋ค๋ฅธ ์์ด์ฝ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ๋ ๋ง์ ์ฌ์ฉ์ ์ ์๋ฅผ ์ํด ์์ด์ฝ์ ์๋์ผ๋ก ๊ด๋ฆฌ ํ๊ฑฐ๋ ์์ด์ฝ ์์คํ
๊ณต๊ธ์๋ก icomoon ๋๋ iconfont ์ ๊ฐ์ ๊ธ๊ผด ์์ด์ฝ ์์ฑ๊ธฐ๋ฅผ ์ ํํด์ผํฉ๋๋ค.
@marcosfede ๋๋
path.resolve(__dirname, "./src/icons.js")
__dirname
์ค์ ๋์ด ์๋์ง ํ์ธreact-app-rewired ๋์์ ํตํด create-react-app์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.
์ ์ฉํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ํ๋ก์ ํธ๋ฅผ ๊บผ๋์ผ๋ฏ๋ก ๋ฃจํธ ํด๋ ๋์ ์นํฉ ํ์ผ์ด์๋ ๊ตฌ์ฑ ํด๋๋ฅผ __dirname
๊ฐ๋ฆฌ ์ผฐ์ต๋๋ค.
AntDesign ํ์ ์ด์ ๋ฐฉ์ (3.9 ์ด์ )์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ๊ณ ๋ คํด์ผํฉ๋๋ค. ๋ ๋์ ๋ฐฉ๋ฒ, ํ๋ช ํ ๋ฐฉ๋ฒ์ ๋๋ค.
์ธํ์ด์ด์ผํฉ๋๋ค. https://github.com/ant-design/ant-design-icons/issues/14
@marcosfede ๋๋
path.resolve(__dirname, "./src/icons.js")
__dirname
์ค์ ๋์ด ์๋์ง ํ์ธ
react-app-rewired ๋์์ ํตํด create-react-app์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.์ ์ฉํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ํ๋ก์ ํธ๋ฅผ ๊บผ๋์ผ๋ฏ๋ก ๋ฃจํธ ํด๋ ๋์ ์นํฉ ํ์ผ์ด์๋ ๊ตฌ์ฑ ํด๋๋ฅผ
__dirname
๊ฐ๋ฆฌ ์ผฐ์ต๋๋ค.
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค!
๋ค์์ ๋ฒ๋ค ํฌ๊ธฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝํ ์ฌํญ์ ๋๋ค.
import StarFilled from 'antd/icons/StarFilled';
<StarFilled />
๋ค์ ๊ตฌ์ฑ ์์์์ ์์ด์ฝ์ ๋ฌธ์์ด๋ก ์ฐธ์กฐํ๋ฉด ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค.
<Icon type="star" />
<Alert iconType="success" />
<Avatar icon="star" />
<Button icon="star" />
Modal.confirm({ iconType: 'star' })
ํธํ์ฑ์ ์ํด ์์ด์ฝ์ ๋ฌธ์์ด๋ก ์ฐธ์กฐ ํ ๋ ์์ฒญ์ SVG ์คํ๋ผ์ดํธ๋ฅผ๋ก๋ํฉ๋๋ค.
์์ด์ฝ์ ๋ฌธ์์ด๋ก ์ฐธ์กฐํ๋ ๋์ ๋ค์ props์ ReactNode๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ ๋ฌํด์ผํฉ๋๋ค.
import StarFilled from 'antd/icons/StarFilled';
<Avatar icon={<StarFilled />} />
@yesmeck ํธ๋ฆฌ ์์ดํฌ์ addIcon
๋ฉ์๋๋ฅผ ๋์์ ๋์
ํ์ง ์๋ ์ข์ ์๋ฃจ์
์
๋๋ค!
์ง๋ฌธ. ์ด๋ฌํ ์์ด์ฝ์ CSS ์คํ์ผ์ด ์๊ณ ์์ด์ฝ ์ ํ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒํด์ผํฉ๋๊น? ๋ชจ๋ ๋์ฒด ์์ด์ฝ์ ์คํ์ผ์ ์ ๋ฌํด์ผํฉ๋๊น?
@michaelpeterlee rc-calendar
๋ antd
๋ฐ @ant-design/icons
์ ์์กดํ์ง ์์์ผ๋ฏ๋ก "์ ์ฒด ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ๋ก๋"ํ์ง ์์์ผํฉ๋๋ค. ์ฌํ ๋ฐ๋ชจ๋ฅผ ์ฌ์ฉํ์ฌ https://github.com/react-component/calendar/issues ์์ ๋ฌธ์ ๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค.
๋ด ์ค์. ๊ด๋ จ์๋ ๋๊ธ์ ์ญ์ ํ์ต๋๋ค. ์์ด์ฝ์ ์๊ฐํ๋ ๊ฒ์ DatePicker
๊ตฌ์ฑ ์์ ์ฌ์ผํฉ๋๋ค.
๋ด ์์ ์ ๋ด ํ๋ก์ ํธ์ ์ด๋์์๋ antd
์์ด์ฝ์ ๊ฐ์ ธ ์ค์ง ์์ง๋ง ์ผ๋ถ antd
๊ตฌ์ฑ ์์๊ฐ Icon
์์ antd
Icon
์ (๋ฅผ) ๊ฐ์ ธ ์ค๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ๊ตฌ์ฑ ์์๊ฐ ์ ์ฒด ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ํ์ํ ์์ด์ฝ ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ค์์ ๋ฒ๋ค ํฌ๊ธฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝํ ์ฌํญ์ ๋๋ค.
ํ
3.11.x
๋ฅผ) ์๋ฏธํฉ๋๊น? 3.10.4
ํฌํจ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@johnernaut # 12888
๋น๋ถ๊ฐ v3.8.4๋ก ๋์๊ฐ์ 3.9.0+ ๋ฒ์ ์ ํจํค์ง ํ ๋๋ฌด ํฝ๋๋ค. ์ ์ ๋ค์ด ์ธ๊ธ ํ ๋ฒ์ ์ ์ผ์์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ฟ์ ๋๋ค. ์์ด์ฝ์๋ก๋ ํ ์์๋ ๋ค์ ๋ฒ์ ์ด ๊ธฐ๋๋ฉ๋๋ค. ๋น๋๊ธฐ ์ ์ผ๋ก.
๊ฐ์ฌํฉ๋๋ค @yesmeck , ๋ค์ ๋ฒ์ ์ ๊ธฐ๋ํฉ๋๋ค.
๋ํ create-react-app
v2 ๋ฐ craco
๋ํ Ant Design ํ๋ฌ๊ทธ์ธ์ ๊ฒ์ํ์์ ์ธ๊ธํ๊ณ ์ถ์์ต๋๋ค. ๋ค์์ GitHub์ craco-antd ํ๋ฌ๊ทธ์ธ์
๋๋ค.
Ant Design Icons ์น์ ์ ํ์ผ๋ฉฐ์ด ๋ฌธ์ (๋ฐ PR )๋ฅผ ๊ณ์ ์ฃผ์ํ๊ฒ ์ต๋๋ค. @sunel (๋ฐ ๊ธฐํ) ํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ณ์นญ ์ค์ ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋ํ ๋งํฌ๋ฅผ ํฌํจํ์ต๋๋ค.
module.exports = {
resolve: {
alias: {
"@ant-design/icons-angular/icons": "/path/to/node_modules/@ant-design/icons-angular/esm2015/icons/ant-design-icons-angular-icons.js"
}
}
}
์ด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ณต์ ์ ์ฅ์์ ์ด์์ ์์ฑํ์ต๋๋ค. ์นํฉ ๊ตฌ์ฑ์ ์ฌ๊ธฐ์ ์๋ ์๋ ng-zorro-antd ํตํฉ ์์ ์์ ์์ ๋์์ผ๋ฉฐ DllPlugin
๋ ํ๋ซ ํ ๋ ES ๋ชจ๋์์ ํธ๋ฆฌ ์์ดํน์ ์ธ๋ชจ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
DllPlugin
๊ฐ ์์ผ๋ฉด ์์๋๋ก ์๋ํฉ๋๋ค.
๋ค์์ ์นํฉ์ด flatten es ๋ชจ๋์์ ํธ๋ฆฌ ์์ดํน์ ์ํํ์ง ์๋ ๊ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ญ์ฌ์ ๋ฐฐ๊ฒฝ์
๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ธ๊ธํ๋ ๊ฒ์ด DllPlugin
์ ์ผ๋ถ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ ์ธํ๊ณ ๋ ์ต๊ทผ ๋ฆด๋ฆฌ์ค์์ ๋๋ถ๋ถ ์์ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ์นํฉ์ด DllPlugin์์ ํธ๋ฆฌ ์์ดํน์ ์ง์ ํ๋ ๊ฒ์ 5 ์์ด ๋์ด์์ผ entryOnly: true
ํ์ง๋ง ์ด์ด ์์์ต๋๋ค. ์ข ๋ ๊ณ ๋ฆฝ ๋ ์์ ๋ฅผ ์์ฑํ๊ณ webpack์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐ ํ ๊ฒ์
๋๋ค.
ํธ์ง : ์ฌ์์ฐ ์ ์ฅ์ ๋ฐ ์ญ์ฌ์ ๋ฌธ์ ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
์ด์ผ๊ธฐ์ ๋ : ๋ณต์ ์ ์ฅ์๋ฅผ ํ์๋ก ๋ง๋๋ ๊ฒ์ ์ฌ๊ธฐ์ ์์ต๋๋ค . ์นํฉ 3.5.6์ entryOnly: true
์ง์์์ด ๋๋ฌด ์ค๋๋์์ต๋๋ค. ์ด๊ฒ์ด fesm5
๋ชจ๋์ด ํธ๋ฆฌ ํ๋ค๋ฆฌ์ง ์๋ ์ด์ ์
๋๋ค.
ng-zorro-antd
๋ฅผ dll ๊ณต๊ธ ์
์ฒด์ ๋ฌถ๊ณ ์ถ์ ๋ถ๋ค์ ์ํด
entryOnly: true
์ DllPlugin
๊ตฌ์ฑ์ ์ถ๊ฐํ์ญ์์ค.module.exports = {
resolve: {
alias: {
"@ant-design/icons-angular/icons": "/path/to/node_modules/@ant-design/icons-angular/esm2015/icons/ant-design-icons-angular-icons.js"
}
}
}
@issuehuntfest ๋์ด ๋ฌธ์ ์ ๋ํด $ 200.00๋ฅผ ์ง์ํ์ต๋๋ค. IssueHunt์์๋ณด๊ธฐ
๊ธ๊ผด ํ์ผ์ด ํจํค์ง์ ์ฐธ์ฌํ์ง ์๊ณ ๋ก์ปฌ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๊น?๋๋ฌด ํฐ
๊ณต์์ ์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ์ต์ ํ ํ ๊ณํ์ ๋๊น? 3.8 ์ด์ ๋ฒ์ ๊ณผ ์ ์ฌํ ๋ก์ปฌ svg ์๋ฃจ์ ์ ์ ๊ณต ํ ์ ์์ต๋๊น?
๊ฐ์ ์ ๊ธฐ๋
๊ณต์์ ์ธ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
@fuhaiwei ๋ค์ ๋ฒ์ ๊น์ง ์์ด์ฝ์ ์ง์ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ์ผ๋ก์ด ์ฃผ์์ ํ์ธํ์ญ์์ค. https://github.com/ant-design/ant-design/issues/12011#issuecomment -423173228
ํ์ฌ webpack.resolve.alias
ํ์ฌ antd/es/icon
๋ฅผ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์ webpack.resolve.alias
๋์ฒดํฉ๋๋ค.
์ด์
๋ธ๋ฆฌ๋ <Icon />
a props.type
๋ฐ props.theme
๊ฐ ์ง์ ๋ API๋ก ์ ์ก๋ฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๋ ๋ชจ๋ ์์ด์ฝ ๋ฐ์ดํฐ๋ ํ์ด์ง ํ
์คํธ ์ค์ ๊ธฐ๋ก ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ฐ์ดํฐ ๋ฐ https://github.com/ant-design/ant-design/issues/12011#issuecomment-423173228์ ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก icons.js
ํฉ๋๋ค.
๋ ๋์ ํด๊ฒฐ์ฑ
์ ์ฐพ๊ธธ ๋ฐ๋๋๋ค.
ํ์ฌ webpack.resolve.alias
๋ฅผ ์ฌ์ฉํ์ฌ antd/es/icon
๋ฅผ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์๋ก ๋์ฒดํ๊ณ ์์ต๋๋ค.
๊ทธ ๊ตฌ์ฑ ์์๊ฐ ๋ณด๋ด๋๋ฆฝ๋๋ค props.type
๋ฐ props.theme
์ <Icon />
์ง์ ๋ API์.
์ด๋ฅผ ํตํด ํ์ด์ง ํ
์คํธ ์ค์ ์ฌ์ฉ ๋ ๋ชจ๋ ์์ด์ฝ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ก ํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ฐ์ดํฐ ๋ฐ https://github.com/ant-design/ant-design/issues/12011#issuecomment-423173228์ ๊ธฐ๋ฐ์ผ๋ก icons.js
์๋์ผ๋ก ์์ฑํฉ๋๋ค.
๋ ๋์ ํด๊ฒฐ์ฑ
์ ์ฐพ๊ธธ ๋ฐ๋๋๋ค.
3 ๊ฐ์์ด ์ง๋ฌ๋๋ฐ, ๊ณต๋ฌด์์ด ์ฃผ๋ฌธํ๋ก๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๊น?
๋์ ๋ฐฉ๋ฒ๋ถํฐ ์์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ธฐ๋ถ์ด ์ข์ผ๋ฉฐ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฃ์ฒ๋ผ ๊ฐ๋ณ์ ์ผ๋ก ์ธ์ฉ๋๋ ๊ฒ์ด ๋๋ฌด ์ข์ต๋๋ค. . ์ด์ ๊ธฐ๋ณธ ์ ๊ณต ์์ด์ฝ์ ์ฌ์ฉํ ์์๋ ๊ตฌ์ฑ ์์ ๋ง ๋ชจ๋ ์์ด์ฝ์ด ํจํค์งํ๋ฉ๋๋ค. .
Icon
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด @ ant-desigin / icons ํจํค์ง๋๋ก๋๋ฉ๋๋ค.
Icon
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด @ ant-desigin / icons ํจํค์ง๋๋ก๋๋ฉ๋๋ค.
Datepicker๋ ์ฌ์ฉ๋๋ฉฐ ์ฝ๋์ ๊ทธ๋ฌํ ํญ๋ชฉ์ด ์๋์ง ํ์ธํ์ญ์์ค. ๋ฉ๋ด๋ ์ฌ์ฉ๋ฉ๋๋ค.
500KB ์ด์์ ๋๋ฌด ํฝ๋๋ค.
ing์ ๊ธฐ๋ํ๋ฉด์ ์๋๋ ์ต์ ๋ฒ์ ์ผ๋ก ๋ฐ๊ฟจ๋๋ฐ ํจํค์ง๊ฐ ๋๋ฌด ํฐ ๊ฑธ๋ณด๊ณ ๋ค์ ๋์๊ฐ๋ ๊ฒ ๋ฌด์์ ์ด์.
SVG ํ์์ ์ฌ์ฉํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ ์ฐํ๊ฒ ๊ตฌ์ฑ ํ ์ ์์ต๋๊น? SVG๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์๋๋ก ๊ตฌ์ฑ
๋จ์ผ ์์ด์ฝ ๋ง ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต ํ ์ ์์ผ๋ฉฐ antd์ ๋ชจ๋ ๋ด๋ถ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
import Search from 'antd/icons/Search";
<Search />
๊ธฐ์กด ํ๋ก์ ํธ์์ ํธํ์ฑ์ ์ํด import { Icon } from 'antd';
์ฌ์ ํ ์์ฝ๋์ด ์์ง๋ง import { Icon } from 'antd';
๋ฅผ ์ฌ์ฉํ๋ ํ ์ ์ฒด ์์ด์ฝ์ ๊ฐ์ ธ์ต๋๋ค.
์์ธต์ ๋์
์๋ฒฝํ ์๋ฃจ์ ์ ๊ธฐ๋ค๋ฆฌ๋ ํ์
500k ์์ด์ฝ, ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์์ด๋ก ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๊น? 500kb๋ ๋ด ๋ฒ๋ค์ 1/4์ ๋๋ค. ๋๋ webpack์ ์ฌ์ฉํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ด์ฝ์ ๊ฐ์ ธ์ต๋๋ค.
import Icon from 'antd/lib/icon';
<Icon type="logout" />
์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์๋ํ๊ณ ์์ด์ฝ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ์ง๋ง 500kb๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์นํฉ์ ์ฌ์ฉํ๊ณ ์๊ณ , Parcel์ ์คํ์ ๋ฒ์ ํธ์ด ์คํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ด์ฝ์ ์ ์ ํ ํธ๋ฆฌ ์์ดํน ํ ์ ์์์ง๋ง ๋ค๋ฅธ 20 ๊ณณ์์ ๋ด ์ฑ์ด ๊นจ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๋๋ค์์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ ์์ต๋๊น? ์ฌ๊ธฐ์์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์ถ๊ฐ 500kb๋ก ํ๋ก์ ํธ๋ฅผ ๋ฐฐ์กํ๊ณ ์์ต๋๊น? ์๋๋ฉด ์ ๊ฐ ๋ฌด์ํ๊ณ ์๋ ํ์คํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๊ฐ์ ธ ์ค๊ธฐ๊ฐ ํ์ค ์นํฉ ๋น๋์์ ์๋ํฉ๋๊น?
import Star from 'antd/icons/star';
๋๊ตฐ๊ฐ ๋๋ฅผ ์
๋ฐ์ดํธ ํ ์ ์๋ค๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
@ApolloGun ํด๊ฒฐ ๋ฐฉ๋ฒ์์ด ์ค๋ ๋์์ ์ฌ๋ฌ ๋ฒ ์ฐธ์กฐ๋์์ผ๋ฉฐ ๋ชจ๋ ๋ด์ฉ์์ด ์ฃผ์์ ์์ต๋๋ค : https://github.com/ant-design/ant-design/issues/12011#issuecomment -423173228
์๋ ๋ฐฉ์์ Webpack์ ๋ค๋ฅธ ์์น, ํนํ ์ฌ์ฉํ๋ ค๋ ์์ด์ฝ์ ์ ํํ ๋ด๋ณด๋ด๋ ์ ํ์ผ์์ ์์ด์ฝ์ ํ์ธํ๋๋ก ์ง์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์์ด์ฝ์ด ์ ์์ ์ผ๋ก ์๋ํ๋ฉฐ ๊ตฌ์ฑ ์์์์ ๋ค๋ฅธ ๊ฒ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ ์์ด์ฝ์ ์ฌ์ฉํ์ง ์์ง๋ง ์ฌ์ ํ ๊ฑฐ๋ํ ํ์ผ์ ์ป์ต๋๋ค. ์๋ง๋ antd์ ๊ตฌ์ฑ ์์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ตฌ์ฑ ์์์์ ์ฌ์ฉ๋๋ ์์ด์ฝ์ ์ด๋ป๊ฒ ํ์ ํฉ๋๊น? ์ด๊ฒ์ Antd ์์ด์ฝ์ Select, Dropdown ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์์ด์ฝ์ผ๋ก ๋์ฒดํ๋ ์ข์ ๋ฐฉ๋ฒ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์์ด์ฝ์ ์ฌ์ฉํ์ง ์์ง๋ง ์ฌ์ ํ ๊ฑฐ๋ํ ํ์ผ์ ์ป์ต๋๋ค. ์๋ง๋ antd์ ๊ตฌ์ฑ ์์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ตฌ์ฑ ์์์์ ์ฌ์ฉ๋๋ ์์ด์ฝ์ ์ด๋ป๊ฒ ํ์ ํฉ๋๊น? ์ด๊ฒ์ Antd ์์ด์ฝ์ Select, Dropdown ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์์ด์ฝ์ผ๋ก ๋์ฒดํ๋ ์ข์ ๋ฐฉ๋ฒ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@HeskeyBaozi ๋ webpack ๋ณ์นญ์ ์ฌ์ฉํ์ฌ antd ๊ตฌ์ฑ ์์์ ์ฌ์ฉ๋๋ ์์ด์ฝ ๋ชฉ๋ก์ ๋ง๋ค์์ต๋๋ค.
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo/blob/master/src/icons.js#L10 -L100
์ด ๋ฐฉ๋ฒ์ ์ดํดํ๋ ค๋ฉด ์ ์ฒด ๋ฌธ์ ํ ๋ก ์ ์ฝ์ผ์ญ์์ค.
@ApolloGun ํ์ฌ ๊ณต์์ ์ธ ํด๊ฒฐ์ฑ
์ด ์์ต๋๋ค.
ํ ์์ฒญ : # 12888์ด ์์ง ์งํ ์ค์
๋๋ค.
@yesmeck , @ afc163 ๊ณง ์ข ๋ฃ ํ ๊ณํ์ด ์์ต๋๊น?
@HeskeyBaozi @ afc163 , ๋น์ ์ด ์์ฑํ์ด ์๋ก์ด ๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? ?
@HeskeyBaozi ์ ๋ํฌ๋ค์ด์ด ์์ ์ํ์ง ์๋์ง ๋ฌผ์ด๋ด๋ ๋ ๊น์? 5 ๊ฐ์์ด ๋์์ต๋๋ค. ์ด๊ฒ ๋ฎ์ ์ฐ์ ์์๋ผ๊ณ ์๊ฐํ์ธ์?
@HeskeyBaozi ์ ๋ํฌ๋ค์ด์ด ์์ ์ํ์ง ์๋์ง ๋ฌผ์ด๋ด๋ ๋ ๊น์? 5 ๊ฐ์์ด ๋์์ต๋๋ค. ์ด๊ฒ ๋ฎ์ ์ฐ์ ์์๋ผ๊ณ ์๊ฐํ์ธ์?
๋์ํฉ๋๋ค, ์ ๋ง ์ง์ฆ๋ฉ๋๋ค = (
antd
์ ์ฝ๋๋ฅผ ๊ฒ์ฌ ํ ํ Button
์ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ Icon
๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ํ์ธํ๊ณ ์์ฑ ๋ ์ฝ๋์ ๋ฐ๋ผ ๊ฐ์ ธ์ต๋๋ค.
// import everything here
import * as allIcons from '@ant-design/icons/lib/dist';
//...
// use everything here :(
ReactIcon.add.apply(
ReactIcon,
_toConsumableArray(
Object.keys(allIcons).map(function(key) {
return allIcons[key];
})
)
);
ํธ๋ฆฌ ์
ฐ์ด ํน์ด ์คํจํ์ฌ ๋ชจ๋ ์์ด์ฝ์ ๊ฐ์ ธ์ต๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ @ant-design/icons/lib/index.es.js
ํ๊ณ ํ์ํ ๋๊น์ง ๋ชจ๋ ์์ด์ฝ์ ๋ํ ์์
์ ์ํํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ํ์ด ๋ผ์ธ์ ์ญ์ฌ๋ฅผ ํ์ธํ์ญ์์ค : https://github.com/ant-design/ant-design/blob/master/components/icon/index.tsx#L3 ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฝ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.
์ด๋ก ์ธํด ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๊ฒ๋ฉ๋๋ค.
@poorel ,
<Icon />
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํฉ๋๋ค. ๋ฐํ์์ ์ด๋ค ์ข ๋ฅ์ ์์ด์ฝ์ ๋์ ํ ์ง ๋ชจ๋ฅด๊ฒ ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ ์๋ ์์ด์ฝ์ดiconfont.cn
ํธ์คํ ๋์์ผ๋ฏ๋ก ํฌ์ฅ์ ๋ํ ์ธ์์ด ์์ต๋๋ค.์ด๋ฅผ ์ํด์๋ ์ค๊ฐ ๊ณํ์ ๋ํ ์ฌ์ธต์ ์ธ ๋ ผ์๊ฐ ํ์ํฉ๋๋ค. # 12011 (์ฃผ์)์ ์ฐธ์กฐํ์ญ์์ค
์ด ์๋ฃจ์ ์ ๊ณ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ ์คํธํ์ง๋ง ํ๋ก์ ํธ์ ์ด๋ค ์์ด์ฝ์ด ์๋์ง ๋ถ๋ฅํด์ผํฉ๋๋ค.
ํ์ง๋ง ํ๋ก์ ํธ์ ์ด๋ค ์์ด์ฝ์ด ์๋์ง ๋ถ๋ฅํด์ผํฉ๋๋ค ...
์ ์ ์ฝ์ด ๋ณด์๋๋ฐ ์์ด์ฝ ์ฐธ์กฐ ์ค ์๋น์๊ฐ antd์ ์์ฒด ๊ตฌ์ฑ ์์์ ์ํด ๋ง๋ค์ด์ก๊ณ ๊ทธ ์๊ฐ ์ ์ง ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ด๊ฐ ์ง์ ์ฌ์ ์์ ์ธ์ฉ ํ ๊ฒ์ ๋งค์ฐ ์ ์ง ๋ง ๊ตฌ์ฑ ์์๋ฅผ ์ฐธ์กฐ ํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ซ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ณ์ฐํ๊ธฐ ์ฝ์ง ์์ต๋๋ค.
@chenyong ์ด , ๊ณ๋์ด ์ํ์. . .
@aryzing ์ ๊ทผ ๋ฐฉ์์ด ๋งค๋ ฅ์ ์ผ๋ก ๋ค๋ฆฝ๋๋ค. # 12888๋ณด๋ค ๋ ธ๋ ฅ์ด ๋ ๋ญ๋๊น? ๊ทธ PR์๋ ๋๋ฌด ๋ง์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ ์๋ง๋ ๋ช ๋ฌ ํ์๋ ์ฌ์ ํ ์๋ฃ๋์ง ์๋ ์ด์ ์ค ์ผ๋ถ์ผ ๊ฒ์ ๋๋ค.
@zachguo # 12888์ ์ดํด ๋ดค๋๋ฐ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ์ ๋ง ์ดํดํ ์ ์์์ต๋๋ค. ๋ฌธ์ ์ ๋ํด ์๊ฐํ ํ ์์ด์ฝ์ ๋ ๋๋งํ๊ธฐ ์ํด ์ผ๋ถ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉํ๋ ๋์ API๊ฐ ํธ๋ฆฌ ์์ดํน์ ์ฌ์ฉ๋๋ ES ๊ฐ์ ธ ์ค๊ธฐ์ ์ ์ ํน์ฑ๊ณผ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ณต์ ์ผ๋ก ์์ด์ฝ์ ํธ๋ฆฌ ์์ดํน ํ ์ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค.
์ผ๋ถ antd ๊ตฌ์ฑ ์์์์ ์ฌ์ฉ๋๋ ์์ด์ฝ์ prop์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค (์ฆ, ๋ฐํ์์ ๊ฒฐ์ ๋จ). ์๋ฅผ ๋ค์ด, Button์ API๋ฅผ ์ดํด๋ณด์ญ์์ค.
<Button icon="search">Search</Button>
์ด ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง ๋๋ ค๋ฉด Button ๊ตฌ์ฑ ์์ (๋๋ ์ฌ์ฉ ๋ ๊ธฐ๋ณธ Icon ๊ตฌ์ฑ ์์)๊ฐ (๋ฐํ์์) ๋ชจ๋ ์์ด์ฝ์ ์ก์ธ์ค ํ ์ ์์ด์ผํ๋ฉฐ ํธ๋ฆฌ ํ๋ค๋ฆผ์ ํ์ฉํ์ง ์์ต๋๋ค.
ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ API๋ฅผ ๊ฐ๋ ๊ฒ์ ๋๋ค.
import {
SearchIcon // not sure if this actually exists
} from '@antd/some-icons-package';
<Button icon={SearchIcon}>Search</Button> {/* option 1 - component */}
<Button icon={() => <SearchIcon />}>Search</Button> {/*option 2 - render prop */}
์ด ์๋๋ฆฌ์ค์์๋ ํ์ํ ๊ฒ๋ง ๊ฐ์ ธ์ค๊ณ ํธ๋ฆฌ ์์ดํน์ @antd/some-icons-package
์์ ์์ ์ฌ์ฉํ์ง ์๋ ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์์ํ๊ณ ์ญ์ ํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋ฐ๋
์ด ๋์์ผ๋ฉฐ ๊ณต์์ ์ธ ํด๊ฒฐ์ฑ
์ ์์ง ์์ต๋๋ค. ํ์ฌ ์ฌ์ฉํ๋ ์๋ฃจ์
์ ๋น๋๊ธฐ๋ก๋์ import()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ๋ ๋ฐ๋
์ด ๋์๊ณ ์์ง ๊ณต์์ ์ธ ํด๊ฒฐ์ฑ
์ด ์์ต๋๋ค. ํ์ฌ ์ ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ํด๊ฒฐ์ฑ
์ ๋น๋๊ธฐ ๋ก๋ฉ์ import()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๊ณต์ React ๋ฌธ์ ์์ ๊ถ์ฅํ๋ Loadable Components ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๊ณต์ React ๋ฌธ์ ์์ ๊ถ์ฅํ๋ Loadable Components๋ฅผ ์ฌ์ฉํ์ญ์์ค.
import React from 'react';
import ReactDOM from 'react-dom';
import { Icon } from 'antd';
ReactDOM.render(
<Icon type="github" />,
document.getElementById('root')
);
@loadable/component
๋ฐ @babel/plugin-syntax-dynamic-import
.@loadable/component
๋ฐ @babel/plugin-syntax-dynamic-import
.๋ ๋ฒ์งธ ๋จ๊ณ๋ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ icons
ํด๋๋ฅผ ๋ง๋ค๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ @ant-design/icons
๋ชจ๋ ์์ด์ฝ์ ๋ด๋ณด๋ด๋ ๊ฒ์
๋๋ค.
๋ ๋ฒ์งธ ๋จ๊ณ๋ ํ๋ก์ ํธ ๋ฃจํธ์ icons
ํด๋๋ฅผ ๋ง๋ค๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ @ant-design/icon
์๋ ๋ชจ๋ ์์ด์ฝ์ ๋ด๋ณด๋ด๋ ๊ฒ์
๋๋ค.
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const util = require('util');
const icons = require('@ant-design/icons');
const fsMkdir = util.promisify(fs.mkdir);
const fsWriteFile = util.promisify(fs.writeFile);
// https://github.com/ant-design/ant-design-icons/blob/master/packages/icons-react/src/utils.ts#L94-L108
const mapping = {
fill: 'fill',
outline: 'o',
twotone: 'twotone',
};
const saveFlag = { encoding: 'utf8', mode: 0o644, flag: 'w' };
(async () => {
const dir = path.join(__dirname, 'icons');
await fsMkdir(dir, 0o755);
const processes = Object.values(icons).map(value => {
if (value && value.name && value.theme) {
// https://github.com/ant-design/ant-design-icons/blob/master/packages/icons-react/src/components/Icon.tsx#L38-L42
const file = path.join(dir, `${value.name}-${mapping[value.theme]}.js`);
const data = `export default ${JSON.stringify(value)}`;
return fsWriteFile(file, data, saveFlag);
}
});
await Promise.all(processes);
})();
๋
ธ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ๋ฐ๋ก ์๋์์์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ @ant-design/icons
์์ ๋ด ๋ณด๋ธ ๋ชจ๋ ์์ด์ฝ์ icons
๋๋ ํฐ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
๋
ธ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ๋ฐ๋ก ์๋์์์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ @ ant-design/icons
์์ ๋ด ๋ณด๋ธ ๋ชจ๋ ์์ด์ฝ์ icons
ํด๋์ ์ ์ฅํฉ๋๋ค.
์ธ ๋ฒ์งธ ๋จ๊ณ๋ Antd ์ฝ๋ ์ ์ฅ์์ components / icon / index.tsx ๋ฅผ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํ๊ณ ์ด๋ฆ์ Icon.jsx
๋๋ Icon.js
๋ก ์ง์ ํ ๋ค์, ๋ค์์์ TypeScript ์ ํ ์ ์๋ฅผ ์ญ์ ํ๋ ๊ฒ์
๋๋ค. ์์ํ JavaScript ์ฝ๋๋ฅผ ์ป๊ธฐ์ํ ์ฝ๋. (ํ๋ก์ ํธ์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Icon.tsx
๋๋ Icon.ts
๋ก ์ง์ ์ด๋ฆ์ ์ง์ ํ ์๋ ์์ผ๋ฏ๋ก ์ ํ ์ ์๋ฅผ ์ญ์ ํ ํ์๊ฐ ์์ต๋๋ค.)
์ธ ๋ฒ์งธ ๋จ๊ณ์์ Antd ์ฝ๋ ์ ์ฅ์์ components / icon / index.tsx ๋ฅผ ํ๋ก์ ํธ ๋ฃจํธ์ ๋ณต์ฌํ๊ณ ์ด๋ฆ์ Icon.jsx
๋๋ Icon.js
๋ก ์ง์ ํ ๋ค์ ์ฝ๋์์ TypeScript ์ ํ ์ ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์์ํ JavaScript ์ฝ๋๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (ํ๋ก์ ํธ์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Icon.tsx
๋๋ Icon.ts
๋ก ์ง์ ์ด๋ฆ์ ์ง์ ํ ์๋ ์์ผ๋ฏ๋ก ์ ํ ์ ์๋ฅผ ์ญ์ ํ ํ์๊ฐ ์์ต๋๋ค.)
๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์ด ์ฝ๋ ํ์ผ์ ์์ import()
๊ฐ์ง @loadable/component
์์์ ๋ถํ ์์ด์ฝ ํ์ผ์.
๊ทธ๋ฐ ๋ค์ ์ฝ๋ ํ์ผ์ ์์ ํ๊ณ import()
์ ํจ๊ป @loadable/component
๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ๋ฐ๋ผ ์์ด์ฝ ํ์ผ์๋ก๋ํฉ๋๋ค.
diff -- a/Icon.tsx b/Icon.jsx
--- a/Icon.tsx
+++ b/Icon.jsx
@@ -1,70 +1,29 @@
import * as React from 'react';
import classNames from 'classnames';
-import * as allIcons from '@ant-design/icons/lib/dist';
+import loadable from '@loadable/component';
import ReactIcon from '@ant-design/icons-react';
-import createFromIconfontCN from './IconFont';
+import createFromIconfontCN from 'antd/es/icon/IconFont';
import {
svgBaseProps,
withThemeSuffix,
removeTypeTheme,
getThemeFromTypeName,
alias,
-} from './utils';
+} from 'antd/es/icon/utils';
-import warning from '../_util/warning';
+import warning from 'antd/es/_util/warning';
-import LocaleReceiver from '../locale-provider/LocaleReceiver';
+import LocaleReceiver from 'antd/es/locale-provider/LocaleReceiver';
-import { getTwoToneColor, setTwoToneColor } from './twoTonePrimaryColor';
+import { getTwoToneColor, setTwoToneColor } from 'antd/es/icon/twoTonePrimaryColor';
+
+const AllIcons = loadable.lib(props => import(
+ /* webpackChunkName: "icons/icon-" */
+ `./icons/${props.type}.js`
+));
// Initial setting
-ReactIcon.add(...Object.keys(allIcons).map(key => (allIcons as any)[key]));
setTwoToneColor('#1890ff');
-let defaultTheme: ThemeType = 'outlined';
+let defaultTheme = 'outlined';
-let dangerousTheme: ThemeType | undefined = undefined;
+let dangerousTheme = undefined;
-
-export interface TransferLocale {
- icon: string;
-}
-
-export interface CustomIconComponentProps {
- width: string | number;
- height: string | number;
- fill: string;
- viewBox?: string;
- className?: string;
- style?: React.CSSProperties;
- spin?: boolean;
- rotate?: number;
- ['aria-hidden']?: string;
-}
-
-export type ThemeType = 'filled' | 'outlined' | 'twoTone';
-
-export interface IconProps {
- tabIndex?: number;
- type?: string;
- className?: string;
- theme?: ThemeType;
- title?: string;
- onKeyUp?: React.KeyboardEventHandler<HTMLElement>;
- onClick?: React.MouseEventHandler<HTMLElement>;
- component?: React.ComponentType<CustomIconComponentProps>;
- twoToneColor?: string;
- viewBox?: string;
- spin?: boolean;
- rotate?: number;
- style?: React.CSSProperties;
- prefixCls?: string;
- role?: string;
-}
-
-export interface IconComponent<P> extends React.SFC<P> {
- createFromIconfontCN: typeof createFromIconfontCN;
- getTwoToneColor: typeof getTwoToneColor;
- setTwoToneColor: typeof setTwoToneColor;
- unstable_ChangeThemeOfIconsDangerously?: typeof unstable_ChangeThemeOfIconsDangerously;
- unstable_ChangeDefaultThemeOfIcons?: typeof unstable_ChangeDefaultThemeOfIcons;
-}
-
-const Icon: IconComponent<IconProps> = props => {
+const Icon = props => {
const {
// affect outter <i>...</i>
className,
@@ -107,7 +66,7 @@
[`anticon-spin`]: !!spin || type === 'loading',
});
- let innerNode: React.ReactNode;
+ let innerNode;
const svgStyle = rotate
? {
@@ -116,7 +75,7 @@
}
: undefined;
- const innerSvgProps: CustomIconComponentProps = {
+ const innerSvgProps = {
...svgBaseProps,
className: svgClassString,
style: svgStyle,
@@ -165,12 +124,19 @@
dangerousTheme || theme || defaultTheme,
);
innerNode = (
- <ReactIcon
- className={svgClassString}
- type={computedType}
- primaryColor={twoToneColor}
- style={svgStyle}
- />
+ <AllIcons type={computedType}>
+ {({ default: loadedIcon }) => {
+ ReactIcon.add(loadedIcon);
+ return (
+ <ReactIcon
+ className={svgClassString}
+ type={computedType}
+ primaryColor={twoToneColor}
+ style={svgStyle}
+ />
+ );
+ }}
+ </AllIcons>
);
}
@@ -181,7 +147,7 @@
return (
<LocaleReceiver componentName="Icon">
- {(locale: TransferLocale) => (
+ {locale => (
<i
aria-label={type && `${locale.icon}: ${type}`}
{...restProps}
@@ -196,7 +162,7 @@
);
};
-function unstable_ChangeThemeOfIconsDangerously(theme?: ThemeType) {
+function unstable_ChangeThemeOfIconsDangerously(theme) {
warning(
false,
'Icon',
@@ -206,7 +172,7 @@
dangerousTheme = theme;
}
-function unstable_ChangeDefaultThemeOfIcons(theme: ThemeType) {
+function unstable_ChangeDefaultThemeOfIcons(theme) {
warning(
false,
'Icon',
๋ง์ง๋ง ๋จ๊ณ๋ Webpack์ ๊ตฌ์ฑํ๋ ๊ฒ์
๋๋ค.
๋ง์ง๋ง ๋จ๊ณ๋ Webpack์ ๊ตฌ์ฑํ๋ ๊ฒ์
๋๋ค.
```diff
diff-a / webpack.js b / webpack.js
--- a / webpack.js
+++ b / webpack.js
@@ -1,4 +1,5 @@
const ๊ฒฝ๋ก = require ( 'path');
+ const webpack = require ( 'webpack');
const HtmlWebpackPlugin = require ( 'html-webpack-plugin');
const TerserPlugin = require ( 'terser-webpack-plugin');
@@ -33,12 +34,16 @@
ํ๋ฌ๊ทธ์ธ : [
new HtmlWebpackPlugin ({
title : 'Awesome Page',
ํ
ํ๋ฆฟ : path.join (__ dirname, 'public / index.html'),
๋ฉํ : {
๋ทฐํฌํธ : 'width = device-width, initial-scale = 1',
},
ํด์ : ์ฐธ,
}),
์ด ์๋ฃจ์
์ ์ฅ์ ์ ๋ชจ๋ ์์ด์ฝ์ ์ ์งํ ์ ์๊ณ ์์ด์ฝ ๋ถ์กฑ์ ๋ํ ๊ฑฑ์ ์์ด ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ด๋ฆฌ ์์คํ
์์ ์์ด์ฝ์ ์์๋ก ์์ ํ ์ ์์ผ๋ฉฐ, ์์ด์ฝ์ ์์ฒญ์๋ก๋๋๋ฉฐ ์ฌ์ฉ์๊ฐ ํ์ํ ๋๋ง๋ก๋๋๋ค๋ ๊ฒ์
๋๋ค. ํน์ ํ์ด์ง์ ์์ด์ฝ ๋ ๋๋ง ์์ ํด๋น ์์ด์ฝ ํ์ผ. ๋ก๋ํด์ผํ๋ ์ ์ผํ ๊ฒ์ ํจํค์ง ์์ธ์์๋ ์ฝ 50K์ ์์ด์ฝ ๋ชฉ๋ก ๋ฐ์ดํฐ์
๋๋ค ( Icon.jsx
์ ์นํฉ ๋งค์ง ์ฃผ์์ ๋ ์งง์ ์ด๋ฆ์ ์ง์ ํ๋ฉด ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์์).
์ด ์๋ฃจ์
์ ์ฅ์ ์ ๋ชจ๋ ์์ด์ฝ์ ์ ์งํ ์ ์๊ณ , ๋๋ฝ ๋ ์์ด์ฝ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ฐฐ๊ฒฝ ๊ด๋ฆฌ ์์คํ
์์ ์์ด์ฝ์ ์์ ํ ์๋ ์์ผ๋ฉฐ, ์์ด์ฝ์ด ์์ฒญ์๋ก๋๋๋ฉฐ ๋ ๋๋ง์ ํ์ํ ์์ด์ฝ ๋ง๋ก๋๋๋ค๋ ๊ฒ์
๋๋ค. ํน์ ํ์ด์ง ๋ ๋๋ง์ ์์ํ ๋๋ก๋ํด์ผํ๋ ํจํค์ง ์์ธ ํ์ผ์๋ ์ฝ 50K์ ์์ด์ฝ ๋ชฉ๋ก ๋ฐ์ดํฐ ๋ง ์์ต๋๋ค ( Icon.jsx
์ Webpack ๋งค์ง ์ฃผ์์ ๋ ์งง์ ์ด๋ฆ์ ์ง์ ํ๋ฉด์ด ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์์).
์ด ์๋ฃจ์
์ ๋จ์ ์ ๊ฐ ์์ด์ฝ์ ์์ด์ฝ ์ฝํ
์ธ ์ธ์ ์ถ๊ฐ Webpack ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์์ด์ฝ ํด๋์ ํฌ๊ธฐ๊ฐ ์ ์ฒด์ ์ผ๋ก ํจํค์ง ๋ ๋จ์ผ ํ์ผ์ ํฌ๊ธฐ์ 50K๋ฅผ ๋ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํฌ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์์ธ์์ ์์ด์ฝ ๋ชฉ๋ก ๋ฐ์ดํฐ๋ ์ค์ ๋ก 3M์ ๊ฐ๊น์ด ํฌ๊ธฐ๋ก ํจํค์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์๋ค๋ก ์ฌ์ฉํ ์์๋ ์์ด์ฝ์ด ๋ช ๊ฐ ๋๋ ์์ญ ๊ฐ์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด๋ก๋ํ๋ ๋ฐ์ดํฐ์ ์์ด ๋๋ฌด ํฌ์ง ์๊ณ ์์ด์ฝ ์๊ฐ ํ์๋๋ ํ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋๋๊ธฐ ๋๋ฌธ์ ๋์์ ํ ํ์ด์ง์์ ๋ ๋ง์ผ๋ฉด ๋ก๋ฉ ์๋์ ๊ฑฐ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์ด ์๋ฃจ์
์ ๋จ์ ์ ๊ฐ ์์ด์ฝ์ ์์ด์ฝ ์ฝํ
์ธ ์ธ์ Webpack ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก icons
ํด๋์ ํฌ๊ธฐ๊ฐ ์ด์ ์ ํจํค์ง ๋ ๋จ์ผ ํ์ผ์ ํฌ๊ธฐ๋ณด๋ค ํจ์ฌ ๋ ํฌ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ธ๋ฑ์ค ํ์ผ์ 50K์ ์์ด์ฝ ๋ชฉ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ด ์ค์ ํจํค์ง ํฌ๊ธฐ๋ 3M์ ๊ฐ๊น์ง๋ง, ์ค์ ๋ก ์ฌ์ฉํ ์์๋ ์์ด์ฝ์ด ์์ญ ๊ฐ์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด๋ก๋ํ๋ ๋ฐ์ดํฐ์ ์์ ๊ทธ๋ฆฌ ํฌ์ง ์์ต๋๋ค. , ๋น๋๊ธฐ์์ผ๋ก๋ก๋๋๊ธฐ ๋๋ฌธ์ ํ ํ์ด์ง์ ํ์๋๋ ์์ด์ฝ ์๊ฐ ๋ง์ง ์์ผ๋ฉด ๋ก๋ฉ ์๋์ ๋ฏธ์น๋ ์ํฅ์ ํฌ์ง ์์ต๋๋ค.
@ jinliming2 ๋ ์นํฉ์ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ ์ค์ ๋ก ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ์๊ธฐ์ํ ๋ฉ์ง ์์ ์ ๋๋ค.
webpack์ ์ต์ํ ์ผ๋ถ ํ์ผ ์์น ์ ๋ณด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ import (foo)์ ๊ฐ์ ์์ ๋์ ๋ฌธ์ ์คํจํฉ๋๋ค. foo๋ ์ ์ฌ์ ์ผ๋ก ์์คํ ๋๋ ํ๋ก์ ํธ์ ๋ชจ๋ ํ์ผ์ ๋ํ ๊ฒฝ๋ก ์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. import ()์๋ ์ต์ํ ์ผ๋ถ ๋ชจ๋์ด์๋ ์์น์ ๋ํ ์ ๋ณด์ด๋ฏ๋ก ๋ฒ๋ค๋ง์ ํน์ ๋๋ ํ ๋ฆฌ ๋๋ ํ์ผ ์ธํธ๋ก ์ ํ ๋ ์ ์์ต๋๋ค.
๋๋ ํ ๋ฆฌ์ ์ ๋์ฌ๊ฐ์๋ ํ ์ด์ ์๋ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ ๊ธดํด๋ antd ์ฌ์ฉ์๋ ์นํฉ์ ์ฌ์ฉํ๋ ๊ฒ๋ง์ด ์๋๋ผ ์กฐ๊ธ ๋นํฉ ์ค๋ฝ์ต๋๋ค.
@aryzing ์ ์ ๋ API์ ์ต์ 1์ด ์ค์ ๋ก # 12888์ด ๋ฌ์ฑํ๋ ค๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๊ด๋ จ๋๋ฏ๋ก Ant Design ํ์ด ์๋ฃ ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ ๊ฒ์ ๋๋ค.
xhr์ ์ฌ์ฉํ์ฌ svg๋ฅผ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๊น?
์์ฒ -svgs
ant deisgn
์์ฒด๋ ๋ ๋ง์ ์์ด์ฝ์ ์ฌ์ฉํ๋ฏ๋ก ๅพๆ ๆไปถ
๋ฅผ ๊ธฐ๋ณธ ํ์ผ ๋ณผ๋ฅจ์ ์ฐจ์งํ์ง ์๋๋ก ๋น๋๊ธฐ๋ก๋ ์ฒด๊ณ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ญ์์ค. ๋ค์์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
ant deisgn ์์ฒด๋ ๋ ๋ง์ ์์ด์ฝ์ ์ฌ์ฉํ๋ฏ๋ก ์์ด์ฝ ํ์ผ์ ๋น๋๊ธฐ ๋ก๋ฉ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๊ธฐ๋ณธ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ฐจ์งํ ํ์๊ฐ ์๋๋ก ๋ค์์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
@rororofff ๋์ด ๋ฌธ์ ์ ๋ํด $ 2.00๋ฅผ ํฌ์ํ์ต๋๋ค.
์ด ๋ํ์ ๊ธธ์ด์ ๊ฒ์ ๋จน๊ณ create-react-app ๋ฐ ant-design์ ์ฌ์ฉํ๋ ค๋ ์ฌ๋์ ์ํด ์ฌ๊ธฐ์ ์์ฉ๊ตฌ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. https://github.com/AustinGreen/cra-antd-starter
์ฌ๊ธฐ์๋ ์์ด์ฝ ๋ฒ๋ค ํฌ๊ธฐ ๋ฌธ์ ์ ๋ํ ์์ ๊ณผ ๊บผ๋ด์ง ์๊ณ ์ฌ์ฉ์ ์ ์ ์นํฉ ๊ตฌ์ฑ์ด ํฌํจ๋ฉ๋๋ค. @ndbroadbent , @patricklafrance ๋ฐ ๋ชจ๋ ๋ ธ๋ ฅ์ ๋ํด ๊ฐ๋ฏธ ๋์์ธ ํ ์ ์ฒด์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ๋ํ์ ๊ธธ์ด์ ๊ฒ์ ๋จน๊ณ create-react-app ๋ฐ ant-design์ ์ฌ์ฉํ๋ ค๋ ์ฌ๋์ ์ํด ์ฌ๊ธฐ์ ์์ฉ๊ตฌ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. https://github.com/AustinGreen/cra-antd-starter
์ฌ๊ธฐ์๋ ์์ด์ฝ ๋ฒ๋ค ํฌ๊ธฐ ๋ฌธ์ ์ ๋ํ ์์ ๊ณผ ๊บผ๋ด์ง ์๊ณ ์ฌ์ฉ์ ์ ์ ์นํฉ ๊ตฌ์ฑ์ด ํฌํจ๋ฉ๋๋ค. @ndbroadbent , @patricklafrance ๋ฐ ๋ชจ๋ ๋ ธ๋ ฅ์ ๋ํด ๊ฐ๋ฏธ ๋์์ธ ํ ์ ์ฒด์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
Nextjs ์ฑ์์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์์ต๋๊น?
@AustinGreen ๋๋ ๋น์ ์ ์๋ฅผ ์๋ํ์ต๋๋ค.
์ฌ์ด๋ ๋ฐ์ ํ๋์ ๋ฒํผ์ด์๋ ์ฑ์ ๊ฒฝ์ฐ ํฌ๊ธฐ๊ฐ ~ 100kB Gzipped ์ธ ๊ฒ์ ์ฌ์ ํ โโ๋๋ฌด ๋ง์ต๋๋ค.
@anjmao ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋ ์ค์ผ ์์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์๋ ค ์ฃผ์๋ฉด ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ์ํฐํ๋ผ์ด์ฆ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๊ฒฝ์ฐ ํ๋ฐํธ ์๋ ํ๋ ์ ์ํฌ ์ฉ์ผ๋ก ~ 100kB Gzipped, ~ 5 ๊ฐ์ ๊ตฌ์ฑ ์์ (์์ ํฌ๊ด์ ์ธ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ), ์์ด์ฝ ๋ฐ ๊ธฐํ ์ ํธ๋ฆฌํฐ๋ ๊ฝค ํ์ค์ ๋๋ค.
@anjmao ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋ ์ค์ผ ์์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์๋ ค ์ฃผ์๋ฉด ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ์ํฐํ๋ผ์ด์ฆ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๊ฒฝ์ฐ ํ๋ฐํธ ์๋ ํ๋ ์ ์ํฌ ์ฉ์ผ๋ก ~ 100kB Gzipped, ~ 5 ๊ฐ์ ๊ตฌ์ฑ ์์ (์์ ํฌ๊ด์ ์ธ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ), ์์ด์ฝ ๋ฐ ๊ธฐํ ์ ํธ๋ฆฌํฐ๋ ๊ฝค ํ์ค์ ๋๋ค.
https://github.com/ant-design/ant-design/issues/12011#issuecomment -420038579 ์ฌ๊ธฐ์ ์ข์ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค
@ Oscar-ren ํ๋ก์ ํธ๋ ์ด๋ฏธ ์์ด์ฝ ๋ณ์นญ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค (์ด๊ฒ์ด ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ~ 400kB๊ฐ ์๋ ~ 100kB ์ธ ์ด์ ์ ๋๋ค).
@tobiaslins ๋ง์ง๋ง ์๊ฒฌ ์ดํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝ ํ์ต๋๊น?
Nuxt ํ๋ก์ ํธ์์ ์ด๊ฒ์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ธก ๋ ๋๋ง์ด ๋๊ธฐํ๋์ง ์์ต๋๋ค.
The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.
์นํฉ ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ Vue์ ๋ฒ์ ์ธ ์ฐธ๊ณ ๋ก :
https://github.com/atjason/ant-design-vue-demo
๋ณด๋ด๋ค:
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo
Hello World
์ ํจํค์ง ํฌ๊ธฐ :
ant deisgn
์์ฒด๋ ๋ ๋ง์ ์์ด์ฝ์ ์ฌ์ฉํ๋ฏ๋กๅพๆ ๆไปถ
๋ฅผ ๊ธฐ๋ณธ ํ์ผ ๋ณผ๋ฅจ์ ์ฐจ์งํ์ง ์๋๋ก ๋น๋๊ธฐ๋ก๋ ์ฒด๊ณ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ญ์์ค. ๋ค์์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.ant deisgn ์์ฒด๋ ๋ ๋ง์ ์์ด์ฝ์ ์ฌ์ฉํ๋ฏ๋ก ์์ด์ฝ ํ์ผ์ ๋น๋๊ธฐ ๋ก๋ฉ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๊ธฐ๋ณธ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ฐจ์งํ ํ์๊ฐ ์๋๋ก ๋ค์์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
ํ์์ ์ํด ์ด๊ฒ์ React์์๋ง ์๋ํฉ๋๋ค.
์๋
ํ์ธ์, @ jinliming2 ์๋ฃจ์
์ ์ธ์ ์ถ์ ๋๋์?
webpack-ant-icon-loader ๊ฐ ์๋ํ์ง ์์ต๋๋ค.
์๋
ํ์ธ์, ์ฌ์ฉ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์๊ฒ ์ต๋๊น?
๋น์ ๊ณผ webpack-ant-icon-loader
?
๋ด๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค ์ ์๋์ง ๋ณด๋๋กํ๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์ @ beven91!
์ด์ ์ ๋ช ๊ฐ์ง ํ
์คํธ๋ฅผ ์ํํ์ง๋ง ์๋ํ์ง ์์๊ณ
์ด์ ๋ฅผ ํ์
ํ์ญ์์ค. ๊ทธ๋ฌ๋ ๊ทํ์ ์ง๋ฌธ์ผ๋ก ์ธํด ์ฌ๊ฑด์
์ฌ๋ฌ๋ถ์๊ฒ ๋ณด์ฌ์ค ์ํ ํ
์คํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์๋ ์๊ฐ! ๊ฒฐ๊ณผ ๋ฒ๋ค์์ 1.21 Mb๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฝํ๊ณ ์์ต๋๋ค.
๋ฐ๋ชจ ํ๋ก์ ํธ์ ์์
์ค์ธ
์์
์ ์ผ๋ก.
๋ค๋ฅธ ์ฌ๋์ด ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ฌ๊ธฐ์ ์์ ํ๋ก์ ํธ๋ฅผ ๊ฒ์ํ๊ณ ์์ต๋๋ค.
๋ฌธ์ :
https://github.com/vladimirmoushkov/ant-icons-webpack-loade-test/#readme
webpack-ant-icon-loader๊ฐ ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
bundle.development.js 4.59 MiB ์ฑ [๋ฐฉ์ถ ๋จ] ์ฑ
webpack-ant-icon-loader๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์ ์ป์ ์ ์์ต๋๋ค.
../../index.html 555 ๋ฐ์ดํธ [๋ฐฉ์ถ ๋จ]
0.bundle.development.js 1.21 MiB 0 [๋ฐฉ์ถ ๋จ]
bundle.development.js 3.41 MiB ์ฑ [๋ฐฉ์ถ ๋จ] ์ฑ
๋ช ๊ฐ์ง ์ฐธ๊ณ ์ฌํญ :
2019 ๋ 4 ์ 5 ์ผ ๊ธ์์ผ ์คํ 2:38 beven91 [email protected] ์์ฑ :
์๋ ํ์ธ์, ์ฌ์ฉ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์๊ฒ ์ต๋๊น?
๋น์ ๊ณผ ํจ๊ป webpack-ant-icon-loader?
๋ด๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค ์ ์๋์ง ๋ณด๋๋กํ๊ฒ ์ต๋๋ค.โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/ant-design/ant-design/issues/12011#issuecomment-480244343 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AUPfoCCVrb5j4s8Qleju8LvdPsxC02FFks5vdzW7gaJpZM4WW7EA
.
๊ทธ๋ฅ ๊ถ๊ธ @AustinGreen ์ด๋ป๊ฒ ๊ฐ๋ฏธ๊ฐ ๋ฌธ์ํ๋ณด๋ค ์๋ฃจ์
์ ๋ค๋ฅธ react-app-rewired
๋ฐ babel-plugin-import
๋ฐฉ๋ฒ์ ์ฌ๊ธฐ ๋ฌธ์ํ - https://ant.design/docs/react/use-with-create-react -app ?
GitHubCreate react ์ฑ ๋ฐ ant ๋์์ธ ์ฌ์ฉ์์ํ ์์ฉ๊ตฌ-AustinGreen / cra-antd-starter
๊ธฐ์ ์์ํ ์ต๊ณ ์ React UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋ ์ธ ๊ณ ํ์ง React ๊ตฌ์ฑ ์์ ์ธํธ๋ฅผ ์ฌ์ฉํ ์ํฐํ๋ผ์ด์ฆ ๊ธ UI ๋์์ธ ์ธ์ด ๋ฐ React ๊ธฐ๋ฐ ๊ตฌํ
@annjawn ์ create-react-app 2.0๋ถํฐ react-app-rewired๊ฐ ๋ ์ด์ ์ ์ง๋์ง ์์ผ๋ฏ๋ก ๋ด ํ๋ก์ ํธ๋ CRA 2.0 ์ฉ react-app-rewired๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ์์ฑ ๋ craco + craco-antd๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@ Beven91 ์ด ์ด์ ์๊ฒฌ ์์ด ๋ถ๋ถ์ ๋์ ์ฃผ์๊ฒ ์ต๋๊น?
- ์์ด์ฝ์ ์ต์ข ์ ํ์์ ์ฌ๋ผ์ง๋๋ค. ์ฆ, ํ์ด์ง์ ํ์๋์ง ์์ต๋๋ค. umirc.js ๊ตฌ์ฑ์ ๋ณด์์ง๋ง react-router๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค์ ํ์ํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น?
์ ์ฒด ๋ฒ๋ค์์ ์์ด์ฝ ์ฌ์ด์ ๋ถ๋ฆฌ๊ฐ ์์ง๋ง ์ฌ์ฉ ๋ ์์ด์ฝ์ ์ฌ์ ํ โโ๋ถ๋ฆฌ ๋ ๋ฒ๋ค์ ์ผ๋ถ๋ก ๋จ์ ์์ผ๋ฏ๋ก์ด๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ถ๋ฆฌ๊ฐ ๋ฌด์๋ฏธํ ๋ถ๋ฆฌ ๋ฒ๋ค๋ก ํฌํจ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
@annjawn ์ create-react-app 2.0๋ถํฐ react-app-rewired๊ฐ ๋ ์ด์ ์ ์ง๋์ง ์์ผ๋ฏ๋ก ๋ด ํ๋ก์ ํธ๋ CRA 2.0 ์ฉ react-app-rewired๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ์์ฑ ๋ craco + craco-antd๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@AustinGreen ์ ์๋ฏธ๊ฐ ์์ง๋ง CRACO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋์ผํฉ๋๋ค. Btw, ๋ํ react-loadable์ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ์ ์ํ ํ ์์ ์ด๋ฉฐ ๋ฉ์๋ + ๋ชจ๋ ์ ๊ฐ์ ธ ์ค๊ธฐ + ๋น๋๊ธฐ ๊ตฌ์ฑ ์์๋ก๋๊ฐ ์๋นํ ๋ฒ๋ค ํฌ๊ธฐ ๊ฐ์๋ฅผ ์ ๊ณตํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋
ํ์ธ์.
๋ฆ์ด์ ์ฃ์กํฉ๋๋ค. ํด๊ฒฐํ๋ ค๊ณ ๋
ธ๋ ฅํ๊ฒ ์ต๋๋คใ
์๋ ํ์ธ์ @vladimirmoushkov
์ฌ๊ธฐ์์ ์์ธํ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค. ant-icons-webpack-loade-test # 1
์์ ๋ ๋๊น์ง ๋๋ฅผ ์ํด ์ผํ ์์ ์๋ฃจ์ (antd> = 3.9)
- ์์ด์ฝ์ ๋ค๋ฅด๊ฒ ํด๊ฒฐํ๋ ค๋ฉด ์นํฉ์ ์กฐ์ ํ์ญ์์ค. ์นํฉ ๊ตฌ์ฑ์์ :
module.exports = { //... resolve: { alias: { "@ant-design/icons/lib/dist$": path.resolve(__dirname, "./src/icons.js") } } };
- ๋ง๋ค๊ธฐ
icons.js
ํด๋์src/
์ด๋๋ ์ง ์ํ๋. ๋ณ์นญ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค!
์ด ํ์ผ์์ antd๊ฐ ํฌํจํด์ผํ๋ ์์ด์ฝ์ ์ ์ํฉ๋๋ค! antd์ Select ๊ตฌ์ฑ ์์์๋ ์๋๋ก ์์ด์ฝ ๋ง ํ์ํ์ต๋๋ค.export { default as DownOutline } from "@ant-design/icons/lib/outline/DownOutline";
config-overwrites.js
๋ด์์react-app-rewire
(create-react-app ์์ )์ผ๋ก์ด ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
์์ด์ฝ์ ์ฌ์ฉํ๋ ๊ฐ๋ฏธ ๊ตฌ์ฑ ์์์๋ ์๋ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒฝ๊ณ ๊ตฌ์ฑ ์์๋ ํ์ธ ๋ฐ ๋ซ๊ธฐ ์์ด์ฝ์ ์ฌ์ฉํ์ง๋ง์ด ์๋ฃจ์ ์์๋ ํ์๋์ง ์์ต๋๋ค.
@ Venugopal46์์๋ icons.js
์๋ ์ด๋ฌํ ์์ด์ฝ (๊ฐ๋ฏธ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉ๋จ)์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
๋๋ฅผ ์ํด ์ ์๋ํฉ๋๋ค.
ํด๊ฒฐ์ฑ ์ ๊ทผ์ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฃํ๋ ค๋ฉด ๋น๋ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก icons.js๋ฅผ ์๋ ์์ฑํ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
icons.js
์ ์ฝ์
ํ๊ธฐ ์ํด ๊ฐ๋ฏธ์ ์์ฒด ๊ตฌ์ฑ ์์๋ฅผ ํตํด ๊ฐ์ ธ์จ ์์ด์ฝ์ ์ ํํ ์ ์์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
๋๋ฅผ ์ํด ์์ ํดํน :
- ์์ด์ฝ์ ๋ค๋ฅด๊ฒ ํด๊ฒฐํ๋ ค๋ฉด ์นํฉ์ ์กฐ์ ํ์ญ์์ค. ์นํฉ ๊ตฌ์ฑ์์ :
module.exports = { //... resolve: { alias: { "@ant-design/icons/lib/dist$": path.resolve(__dirname, "./src/icons.js") } } };
- ๋ง๋ค๊ธฐ
icons.js
ํด๋์src/
์ด๋๋ ์ง ์ํ๋. ๋ณ์นญ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค!
์ด ํ์ผ์์ antd๊ฐ ํฌํจํด์ผํ๋ ์์ด์ฝ์ ์ ์ํฉ๋๋ค! antd์ Select ๊ตฌ์ฑ ์์์๋ ์๋๋ก ์์ด์ฝ ๋ง ํ์ํ์ต๋๋ค.export { default as DownOutline } from "@ant-design/icons/lib/outline/DownOutline";
config-overwrites.js
๋ด์์react-app-rewire
(create-react-app ์์ )์ผ๋ก์ด ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ generateIconsList.sh
ํ์ผ์ ์ฌ์ฉํ์ฌ src/icons.js
:
grep -iR \<Icon\ ./src/ | cut -d: -f2 | sed -e s/.*\<Icon\ //g | sort | uniq | while read icon; do
theme='Outline';
themelowercase="outline";
if [[ $icon =~ ^.*twoTone.*$ ]]; then
theme="TwoTone";
themelowercase="twotone";
fi
if [[ $icon =~ ^.*fill.*$ ]]; then
theme="Fill";
themelowercase="fill";
fi
icon=$(echo $icon | sed -e 's/type\=\"//g'| sed -e 's/\".*//g' | sed -e 's/\-/ /g')
icon=$(python -c "print('"$icon"'.title())")
icon=$(echo $icon | sed -e 's/ //g')
core_path="@ant-design/icons/lib/"$themelowercase"/"$icon$theme
search_path="node_modules/"$core_path".js"
if [ -e $search_path ]; then
echo "export { default as "$icon$theme" } from \""$core_path"\";"
fi
done | sort | uniq
ํ๋ก์ ํธ ๋ฃจํธ์์ generateIconsList.sh 2>/dev/null >src/icons.js
๋ฅผ ์คํ ํ์ฌ ์์
์ ์ํํฉ๋๋ค! .
์คํฌ๋ฆฝํธ๋ ์ถ์
ํ ํดํน์ด๋ฉฐ ๋ถ๋ช
ํ ๋ด๋ถ ์์ด์ฝ ์ฐธ์กฐ ๋๋ ์ฌ๋ฌ ์ค๋ก ๋ <Icon />
์ฐธ์กฐ๋ฅผ ํฌ์ฐฉํ์ง ์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ ๋ช ๊ฐ์ง ์์ด์ฝ ์ผ์ด์ค๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํด์ผํ์ง๋ง ์คํฌ๋ฆฝํธ๋ ๊ฒฐ๊ตญ ์์
์ ์ํ ํฉ๋๋ค. ์ต์ข
๋ฒ๋ค์์ 1.1MB๊ฐ ๋ ์ ์ต๋๋ค!
icons.js
์ ์ฝ์ ํ๊ธฐ ์ํด ๊ฐ๋ฏธ์ ์์ฒด ๊ตฌ์ฑ ์์๋ฅผ ํตํด ๊ฐ์ ธ์จ ์์ด์ฝ์ ์ ํํ ์ ์์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
์น ํ์ด์ง์์ ๋๋ฝ ๋ (ํ์๋์ง ์์) ์์ด์ฝ์ ์ถ๊ฐํ๊ณ ์์ง๋ง ๊ฑฐ๊ธฐ์ ์์ด์ผํฉ๋๋ค. ์ผ๋ง๋ ๋ง์ antd์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์ ์๊ฒ๋ ์ถ๊ฐํ๋ ๋ฐ ์ฝ 10 ๋ถ์ด ๊ฑธ๋ ธ์ต๋๋ค. (๋๋ ๋ง์ ๊ฐ๋ฏธ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ง๋ง)
์๋ฅผ ๋ค์ด ํ ์ด๋ธ์ ์ ๋ ฌ ํ์ดํ๊ฐ์๋ ๊ฒฝ์ฐ :
<i aria-label="icon: caret-down" class="anticon anticon-caret-down ant-table-column-sorter-down off">
์ฐพ์ต๋๋ค. ์ด <i />
ํ๊ทธ๊ฐ ๋น์ด ์์์ ์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์์ด์ฝ ์ด๋ฆ์ด caret-down
์์ ์ ์ ์์ต๋๋ค.@ant-design/icons/lib
ํด๋์์์ด ์์ด์ฝ์ ์ฐพ๊ณ filled
๋๋ outline
ํด๋ (ํ์ํ ์์ด์ฝ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ)๋ฅผ ์ ํํ ๋ค์ icons.js
์ ์ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. :export { default as CaretDownOutline } from '@ant-design/icons/lib/outline/CaretDownOutline';
์ต์ ์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์์๋๋ก ์๋ํฉ๋๋ค. ๊ฐ๋ฏธ ๊ฐ๋ฐ ํ์ด ํฅํ ๋ฆด๋ฆฌ์ค์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ด๋ฌํ ๋๋ฌ์ด ํดํน์ ํผํ ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
์๋ ํ์ธ์ !
์ด ์ฃผ์ ์ ๋ํ ์์์ด ์์ต๋๊น? ๋ค์ antd์ ์ถ์ ํ๋ณด์
๋๊น?
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์๋๋ฅผํ์ง๋ง ( webpack-ant-icon-loader
, babel-import-plugin
) ์๋ฌด ๊ฒ๋ ์๋ํ์ง ์์์ต๋๋ค.
๊ฐ์ฌ!
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์ ๋ง๋ก ํ์ํฉ๋๋ค. ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ๋๋ฌด ๋ง์ต๋๋ค!
@zlab @nuintun @anjmao ์ ๋์์ด ํ์ํ๋ฉด https://zlab.github.io/report.html ์ด ํ์ด์ง์์ ์์ฑ ๋ ํ๋ฌ๊ทธ์ธ์ด ๋ฌด์์ธ์ง ๋ฌผ์ด๋ณด์ญ์์ค. ๋ด ํ๋ก์ ํธ๋ฅผ ๋ถ์ํ๊ณ ์ถ์ต๋๋ค.
์ฐพ์์ต๋๋ค. webpack-bundle-analyzer์ ๋๋ค.
๋ชจ๋ฌ ๋ง ์ฌ์ฉ๋์ง๋ง 500k ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํจํค์ง๋ฉ๋๋ค.
๋ฐ๋ ์ด ๋์๋๋ฐ ์ง์ ์ด ์๋์?
antd๋ฅผ ๋ฒ๋ฆฌ๊ณ , ๊ทธ๋ฐ ์ค์ํ ๋ฌธ์ ๋ ์ค์ํ์ง ์๋ค ...
์ด์ ํ์์ ๋ฐ๋ผ ์์ด์ฝ์ผ๋ก ํจํค์งํด์ผํ๋ ํ์ผ์๋ก๋ํฉ๋๋ค. 500kb
๋ด ์นํฉ์ ๋ณ์นญ์ ์ถ๊ฐํ๊ณ icon.ts์ ์์ด์ฝ์ ๋ด๋ณด๋์ง๋ง npm start
์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ERROR in ./node_modules/antd/lib/icon/index.js
Module not found: Error: Can't resolve '@ant-design/icons/lib/dist' in 'xxx\node_modules\antd\lib\icon'
์ด๊ฒ์ ๋ด webpack ํด๊ฒฐ ๊ตฌ์ฑ์ ๋๋ค.
resolve: {
modules: [path.resolve(__dirname, '../src'), 'node_modules'],
alias: {
'@ant-design/icons/lib/dist$': path.resolve(
__dirname,
'../src/utils/antdIcon.ts',
),
},
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
plugins: [
new TsConfigPathsPlugin({
tsconfig: path.resolve(__dirname, '../tsconfig.json'),
}),
],
},
1. ํ๋ก์ ํธ์์ ์์ด์ฝ ์์ด์ฝ์ด ์ฌ์ฉ๋์ง ์์ต๋๋ค. ํจํค์ง๊ฐ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ๋์์ฃผ์ธ์.
2. webpack externals = { 'antd': 'antd'} ์ฌ์ฉ์ด ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ํจํค์ง ๋ถ์์์ antd๋ฅผ ๋ณผ ์ ์์ต๋๊น?
1. ํ๋ก์ ํธ์์ ์์ด์ฝ ์์ด์ฝ์ด ์ฌ์ฉ๋์ง ์์ต๋๋ค. ํจํค์ง๊ฐ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋์์ฃผ์ธ์.
2. webpack externals = { 'antd': 'antd'} ์ฌ์ฉ์ด ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ํจํค์ง ๋ถ์์์ antd๋ฅผ ๋ณผ ์ ์์ต๋๊น?
@wiiler
์ฐธ๊ณ ๋ก Icon์ ์ฐธ์กฐํ๋ ์ปดํฌ๋ํธ ์ผ ์ ์์ต๋๋ค.
https://github.com/ant-design/ant-design/issues/12011#issuecomment -418003883
์ค์ ๋ก<DatePicker />
,<Select />
๋ฑ๊ณผ ๊ฐ์ด<Icon />
๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ๊ณต ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์ ์์ ํ ๋์ ๋ฉ๋๋ค.
์ธ๋ถ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ babel-plugin-import ํ๋ฌ๊ทธ์ธ์ ๊บผ์ผํฉ๋๋ค.
๋ด ์นํฉ์ ๋ณ์นญ์ ์ถ๊ฐํ๊ณ icon.ts์ ์์ด์ฝ์ ๋ด๋ณด๋์ง๋ง
npm start
์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.ERROR in ./node_modules/antd/lib/icon/index.js Module not found: Error: Can't resolve '@ant-design/icons/lib/dist' in 'xxx\node_modules\antd\lib\icon'
์ด๊ฒ์ ๋ด webpack ํด๊ฒฐ ๊ตฌ์ฑ์ ๋๋ค.
resolve: { modules: [path.resolve(__dirname, '../src'), 'node_modules'], alias: { '@ant-design/icons/lib/dist$': path.resolve( __dirname, '../src/utils/antdIcon.ts', ), }, extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], plugins: [ new TsConfigPathsPlugin({ tsconfig: path.resolve(__dirname, '../tsconfig.json'), }), ], },
์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ถ์ฅํฉ๋๋ค.
๋ฟก ๋นต๋จ
์ '../src/utils/antdIcon.ts'์ '..'๊ฐ ์์ต๋๊น? ์นํฉ ๊ตฌ์ฑ์ด ๋ณ๋์ ๋๋ ํ ๋ฆฌ์ ์์ต๋๊น?
1. ํ๋ก์ ํธ์์ ์์ด์ฝ ์์ด์ฝ์ด ์ฌ์ฉ๋์ง ์์ต๋๋ค. ํจํค์ง๊ฐ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋์์ฃผ์ธ์.
2. webpack externals = { 'antd': 'antd'} ์ฌ์ฉ์ด ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ํจํค์ง ๋ถ์์์ antd๋ฅผ ๋ณผ ์ ์์ต๋๊น?@wiiler
- ์ฐธ๊ณ ๋ก Icon์ ์ฐธ์กฐํ๋ ์ปดํฌ๋ํธ ์ผ ์ ์์ต๋๋ค.
> # 12011 (์ฝ๋ฉํธ)
> ์ค์ ๋ก<DatePicker />
,<Select />
๋ฑ๊ณผ ๊ฐ์ด<Icon />
๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ๊ณต ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์ ์์ ํ ๋์ ๋ฉ๋๋ค.- ์ธ๋ถ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ babel-plugin-import ํ๋ฌ๊ทธ์ธ์ ๊บผ์ผํฉ๋๋ค.
์ดํด , ๊ฐ์ฌํฉ๋๋ค
๋ด ์นํฉ์ ๋ณ์นญ์ ์ถ๊ฐํ๊ณ icon.ts์ ์์ด์ฝ์ ๋ด๋ณด๋์ง๋ง
npm start
์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.ERROR in ./node_modules/antd/lib/icon/index.js Module not found: Error: Can't resolve '@ant-design/icons/lib/dist' in 'xxx\node_modules\antd\lib\icon'
์ด๊ฒ์ ๋ด webpack ํด๊ฒฐ ๊ตฌ์ฑ์ ๋๋ค.
resolve: { modules: [path.resolve(__dirname, '../src'), 'node_modules'], alias: { '@ant-design/icons/lib/dist$': path.resolve( __dirname, '../src/utils/antdIcon.ts', ), }, extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], plugins: [ new TsConfigPathsPlugin({ tsconfig: path.resolve(__dirname, '../tsconfig.json'), }), ], },
์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ถ์ฅํฉ๋๋ค.
๋ฟก ๋นต๋จ
์ '../src/utils/antdIcon.ts'์ '..'๊ฐ ์์ต๋๊น? ์นํฉ ๊ตฌ์ฑ์ด ๋ณ๋์ ๋๋ ํ ๋ฆฌ์ ์์ต๋๊น?
๋ฏธ์ ํด์, ์ ์๋ชป์ด์์. ์๋ชป๋ ํ์ผ ์ด๋ฆ์ ์ผ๋๋ฐ ์ด์ ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์ต๋๋ค. ๊ฐ์ฌ
์ด ๋ฌธ์ ๋ ์์ผ๋ก ํด๊ฒฐ๋์ง ์์๊น์? ๊ฑฐ์ 400k ์ฆ๊ฐ
์๋ ํ์ธ์, ์ธ์ ํด๊ฒฐ ๋ ์ง ๋๋ต์ ์ธ ์์ ์๊ฐ์ ์ ๊ณต ํ ์ ์์ต๋๊น?
๋ฒ๋ค์ ์ถ๊ฐ 490kb๊ฐ ์์ผ๋ฉด Icon
๊ฑฐ์ ์ฌ์ฉํ ์ ์๊ฒ๋ฉ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ํฐ ๋ฌธ์ ์
๋๋ค. ์ด์ ๋ํ ์์ ์ ๋ฆด๋ฆฌ์ค ํ ๋๊น์ง ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ์์ ์์ ์ด ์์ต๋๊น?
@smddzcy ๊ฐ ์ค๋ ๋๋ฅผ ์ฝ์์ต๋๊น?
@ schester44 ๋ค์ํ ์ธ์ด๋ก ์ฐ์ธ ์ฐ๋ ๋์โฆ ์ํ๋ฒณ์ด๋ ์ฌ์ง์ด ์์ ๊น์ง ๋งํ๋ ค๊ณ ํ์ง๋ง ๋๋ณธ ๊น์ง ๊ฐ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋คโฆ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์ ํ ๋ช ํํ๊ฒํ๊ธฐ ์ํด ์ํธ๋ฃจ๋ฆฌ์์์ ํ์ ๋ ์ํ๋ฒณ์ผ๋ก ์ ํ๋ฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ ์์ฃผ ๊ฐ๋จํ purched-antd-icons ํจํค์ง ๊ตฌํ์ผ๋ก ์ฑ๊ณตํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์์ ํ ์๋์ ๋๋ค. DOM์ ๊ฒ์ฌํ์ฌ ๋๋ฝ ๋ ์์ด์ฝ์ ์กฐ์ ํ๋ ๋ฐ 3-4 ์๊ฐ ์ ๋ ์์๋ฉ๋๋ค. ๊ฐ๋ฐ / ์ถ์์ฃผ๊ธฐ์ ๋ง์ง๋ง ๋จ๊ณ์์์ด๋ฅผ ๊ตฌํํ๋ ค๊ณ ํฉ๋๋ค. ํจํค์ง / ์คํ๋ผ์ธ ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ ์ผํ ๋ฌธ์ ๋ iOS WKWebview RAM ์ ํ์ ์ ๊ทผํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ iOS ๋ชจ๋ฐ์ผ ํ๋กํ์ ๊ณ์ํด์ ์ธ๊ณต๋ฌผ์ด ๋ํ๋์ง ์์ผ๋ฉด์ด๋ฅผ ์์ ํ ๋ฌด์ํฉ๋๋ค. ์ฌ๊ธฐ์์ ์งํ์ด ์ด๋ฃจ์ด์ง์ง ์์๊ธฐ ๋๋ฌธ์์ด ์๋ก์ด Icon API๊ฐ ๋ณด๋ฅ๋๊ณ ์ด์ API๊ฐ ๋ณต์๋๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
@ afc163 ,
2018 ๋ 9 ์ 15 ์ผ์ ์์ฑํ ๋ด์ฉ์ด ์ข์ ํด๊ฒฐ์ฑ ์ธ ๊ฒ ๊ฐ์ต๋๋ค (์๋ Google ๋ฒ์ญ). ์ด๊ฒ์ด ์ธ์ ๊ตฌํ ๋ ์ง ์์ ํ ์ ์์ต๋๊น?
์ด์ ์ฌ์ฉ๋์ ์ ์งํ๊ณ ์ฝ์์ ๊ฒฝ๊ณ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํฉ๋๋ค.
import { Icon } from 'antd'; <Icon type="star" />
๋ค์๊ณผ ๊ฐ์ ๊ณต๊ธ์ ์ API :
import Star from 'antd/icons/Star'; import Setting as SettingIcon from 'antd/icons/Setting'; <Star /> <SettingIcon />
ํธ๋ฆฌ ์์ดํน๋ ๊ฐ๋ฅํฉ๋๋ค.
import { Icon: { Star, Setting } } from 'antd'; <Star /> <SettingIcon />
ํธ์ ๋ด์ ๊ฐ๊ธฐ
V4 ๋ก๋๋งต ์ ๋ฐ๋ฅด๋ฉด ์ฌํด 4 ๋ถ๊ธฐ์ ์์ ๋ ์์ ์ ๋๋ค.
์ฟจ : ์ค๋ง์ผ :
Vร o Th 7, 1 thg 6, 2019 vร o lรบc 01:51 Zach Guo [email protected]
ฤรฃ viแบฟt :
V4 ๋ก๋๋งต์ ๋ฐ๋ฅด๋ฉด
https://github.com/ant-design/ant-design/issues/16911 , ์ด๊ฒ์
์ฌํด 4 ๋ถ๊ธฐ๋ก ๊ณ ์ ๋์์ต๋๋ค.โ
๋๊ธ์ ๋ฌ์ ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/ant-design/ant-design/issues/12011?email_source=notifications&email_token=ADKDE4RXC63VER4GSUMG5Q3PYFXT7A5CNFSM4FS3WEAKYY3PNVWWK3TUL52HS4DFVRWSG43VMVORBW63LNMWW2978978P847ZGissuement-4WXHJKT
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ADKDE4TGAYRMSJQB246RQ33PYFXT7ANCNFSM4FS3WEAA
.
ICYMI, Icon ๋ฌธ์ ๋ ์ด๊ฒ์ ์ธ๊ธํ์ต๋๋ค. ์๋ ์ฌ๋ณธ.
"โ ๏ธ 3.9.0์์ ๊ฐ์ ธ์จ ๋ชจ๋ SVG ์์ด์ฝ์์ ๊ฐ์ ธ์จ ์ถ๊ฐ ๋ฒ๋ค ํฌ๊ธฐ์ ๋ํด์๋ ๊ฐ๋ฐ์๊ฐ ํ์์ ๋ฐ๋ผ ์์ด์ฝ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์๋ก์ด API๋ฅผ ์ ๊ณต ํ ๊ฒ์
๋๋ค. ์ถ๊ฐ ์งํ์ ์ํด # 12011์ ์ถ์ ํ ์ ์์ต๋๋ค.
๊ทธ ์ ์ ์ปค๋ฎค๋ํฐ์ ์นํฉ ํ๋ฌ๊ทธ์ธ ์ ์ฌ์ฉํ์ฌ ์์ด์ฝ ํ์ผ์ ์ฒญํฌ ํ ์ ์์ต๋๋ค. "
๋ง์ง๋ง ๋นํธ๋ ๋ฉ์ง๊ณ , ์ฝ๋ ๋ถํ ๋ฐ ์์ด์ฝ์ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋ํ๊ฑฐ๋, ์ ๊ฒฝ์ฐ์๋ ์ฝ๋๊ฐ ๋ถํ ๋๊ณ ์์ด์ฝ์ ์ ํ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ณต๋ฌด์์ด ํฌ๊ธฐ ํ๋์? ์ผ๋ง๋ ๋๊ณ ์์ง ํด๊ฒฐ๋์ง ์์๋์?
๊ณต๋ฌด์์ด ํฌ๊ธฐ ํ๋์? ์ผ๋ง๋ ๋๊ณ ์์ง ํด๊ฒฐ๋์ง ์์๋์?
@ zhe-he
๋ช ํํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค!
์ด ๊ณต๋ฌด์์ด ์ ๋ง์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์์๊น์?๋๋ฌด ํฌ๊ณ ๋ถํ์ํ ํจํค์ง, ์ ๋ง ๋น์ ์ด ๋ ๋๋๋ก ์ค๋
ํ
@tibotiber icon-loader ๋งํฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์์ด์ฝ ์ฒญํฌ๋ ์ฌ์ ํ index.html์ ์ฝ์ ๋ฉ๋๊น? index.html์์ ์ฝ์ ๋๋ ์ฒญํฌ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์
@ jasan-s ๋ฒ๋ค์ ๋น๋ํ๋ ๋ฐฉ๋ฒ๊ณผ ์์ด์ฝ์ ์ฌ์ฉํ๋ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฝ๋ ๋ถํ ์ ๊ตฌ์ฑํ๋ ์ต์ create-react-app์ ์ฌ์ฉ import
์์ด์ฝ์ด ์๋์ง ํ์ธํฉ๋๋ค (์์ด์ฝ์ ์ฌ์ฉํ์ง ์์). .
ํด๊ฒฐ ๋ฐฉ๋ฒ @tobiaslins์์ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค, ๊ทธ๊ฒ์ ๋งํ๋ค
Module not found: Error: Can't resolve '@ant-design/icons/lib/dist' in '/Users/fede/Projects/despe/deliveries/node_modules/antd/es/icon'
์บ ๋๊ตฌ ํฌ์ธํธ ๋ ๊ทธ๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ? ๊ฐ์ฌ
@marcosfede ๋๋ customize-cra๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๊บผ๋ด์ง ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์ฌ์ ํ์ด ์ค๋ฅ๊ฐ ์์ต๋๋ค.
./node_modules/antd/lib/icon/index.js
Cannot find module: '@ant-design/icons/lib/dist'. Make sure this package is installed.
You can install this package by running: yarn add @ant-design/icons/lib/dist.
ํธ์ ๋ด์ ๊ฐ๊ธฐ ๋ด ์๋ชป์ด์ผ. ์ด์ ์๊ฒ ์ต๋๋ค.
์์ด๋์ด๊ฐ ์์ต๋๋ค ๐ก @ afc163
svg ์์ด์ฝ์ ์ฌ์ฉํ๊ณ ์ด์ ์ฌ์ฉ๋ฒ์ ์ ์งํ ์ ์์ต๋๋ค.
<Icon type='search' />
๊ทธ๋ฐ ๋ค์ babel ํ๋ฌ๊ทธ์ธ์ ํตํด ๋ค์์ ์ํํฉ๋๋ค.
import _searchIcon from '@ant-design/icons/lib/dist/search.svg'
<Icon component={ _searchIcon } />
// ๆ่
็ดๆฅ่ฝฌๅๆ
<Icon component={ require('@ant-design/icons/lib/dist/search.svg') } />
๊ทธ๋ฐ ๋ค์ ํธ๋ฆฌ ์์ดํน์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ ๋ ์์ด์ฝ ๋ง ํจํค์ง ํ ์ ์์ต๋๋ค.
๋ค์ด๋๋ฏน ํ์ ์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ์ธ์. ๋์ ์์๊ฐ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import * as AllIcons from '@ant-design/icons/lib/dist'
<Icon component={ AllIcons[type] } />
์ค์ ๋ก ์๋ ์ ํ์ ์ค์ ๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋๊ณ ๋ชจ๋ ์ ํ ์ฌ์ฉ์ด ๊ตฌ์ฑ ์์ ์ฌ์ฉ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์์ด๋์ด๊ฐ ์์ต๋๋ค ๐ก @ afc163
svg ์์ด์ฝ์ ์ฌ์ฉํ๊ณ ์ด์ ์ฌ์ฉ๋ฒ์ ์ ์งํ ์ ์์ต๋๋ค.
<Icon type='search' />
๊ทธ๋ฐ ๋ค์ babel ํ๋ฌ๊ทธ์ธ์ ํตํด ๋ค์์ ์ํํฉ๋๋ค.
import _searchIcon from '@ant-design/icons/lib/dist/search.svg' <Icon component={ _searchIcon } /> // ๆ่ ็ดๆฅ่ฝฌๅๆ <Icon component={ require('@ant-design/icons/lib/dist/search.svg') } />
๊ทธ๋ฐ ๋ค์ ํธ๋ฆฌ ์์ดํน์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ ๋ ์์ด์ฝ ๋ง ํจํค์ง ํ ์ ์์ต๋๋ค.
๋ค์ด๋๋ฏน ํ์ ์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ์ธ์. ๋์ ์์๊ฐ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import * as AllIcons from '@ant-design/icons/lib/dist' <Icon component={ AllIcons[type] } />
์ค์ ๋ก ์๋ ์ ํ์ ์ค์ ๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋๊ณ ๋ชจ๋ ์ ํ ์ฌ์ฉ์ด ๊ตฌ์ฑ ์์ ์ฌ์ฉ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์์ด๋์ด๋ 4.0 ๋ณํ๊ณผ ๋์ผํ์ง๋ง ๋ฐ๋ฒจ ์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๋ถํ๊ฐ ๋ถ๋ช ํ ์ค์ด๋ค๊ณ ๋์ ๋ณ๊ฒฝ ๋ง ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฉด๋ฉ๋๋ค.
๋๋ ์ผ์์ ์ผ๋ก ์ง๋ ๋ฐค์ ์ฝ๋ฉํธ๋ฅผ ๊ฒ์ ํ ํ ํ๋ฌ๊ทธ์ธ ๋ฐ๋ฒจ์ ์ผ๋ค. ๋ด๊ฐ ๋ก์ปฌ์ ์๋ํ๊ณ ์์ ํ ๊ฐ๋ฅ @ afc163,
const template = require('@babel/template')
function genRequireEpx (name) {
return template.expression(`require('@ant-design/icons/lib/dist/${name}.svg')`)()
}
module.exports = function ({ Plugin, types: t }) {
return {
visitor: {
// <Icon type='search' />
JSXElement({ node }, { opts: { patterns = [] } }) {
const { name, attributes } = node.openingElement
if (!(name && name.name === 'Icon') || !attributes || !attributes.length) {
return
}
attributes.forEach(attr => {
if (attr.name.name === 'type') {
attr.name.name = 'component'
attr.value = genRequireEpx(attr.value.value)
}
})
},
// React.createElement(Icon, { type: "search" }
CallExpression({ node }, { opts: { patterns = [] } }) {
const cal = node.callee
const arg = node.arguments
if (!(cal.object && cal.object.name === 'React' &&
cal.property && cal.property.name === 'createElement' &&
arg[0] && arg[0].name === 'Icon' &&
arg[1] && arg[1].properties
)) {
return
}
arg[1].properties.forEach(obj => {
if (obj.key.name === 'type') {
obj.key.name = 'component'
obj.value = genRequireEpx(obj.value.value)
}
})
},
}
};
}
๋ํ ํํฅ ๋ณํ ๊ท์น ๋ฐ ๊ฑฐ์ธ ์ ํ์ ์ค์ ๊ธฐ๋ฅ์ ๊ฐ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์งํ ์ํฉ?
๊ณต์ ์์ด์ฝ ์์ค ์ฝ๋์์์ด ํจํค์ง์ ๋ํ ์๋ฃจ์
์ ํ์ธํ๊ณ ์์ด์ฝ์ ๋ณ๋๋ก js๋ก ํจํค์งํ์ญ์์ค.
https://github.com/Beven91/webpack-ant-icon-loader
@ARKKYN antd v4 ์์ ์ค # 16911
์ด์ antd 4์ ์ํ ๋ฒ์ ์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
https://github.com/ant-design/ant-design/releases/tag/4.0.0-alpha.2
๋๋ฌด ํ๋ค๊ธฐ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์์ด์ฝ์ ๋น๊น๋๋ค.
์ด ๊ณต๋ฌด์์ด ์ ๋ง์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์์๊น์?๋๋ฌด ํฌ๊ณ ๋ถํ์ํ ํจํค์ง, ์ ๋ง ๋น์ ์ด ๋ ๋๋๋ก ์ค๋
์ฌ์ค, ์ด๊ฑด afc163์ด ํฌ๋ฆฌ์ค๋ง์ค ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
@ lizy0329 4.0.0-alpha.2๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ์๋์ง์ ์๊ฐ ์กฐ์ ์ด ํฌํจ๋ฉ๋๋ค. ๊ธํ ๊ฒฝ์ฐ ํฌํฌ๊ฐ ์ง์ ๋ณ๊ฒฝํฉ๋๋ค ...
@ lizy0329 https://github.com/ant-design/ant-design/pull/18217 ์ฐธ์กฐ
์ ๋ง ๋ฉ์ง์ง ์์ต๋๋ค.
แ แ แ แ แ แ
์ ๋ง ๋ฉ์ง์ง ์์ต๋๋ค.
์ ๋ง ๋ฉ์ง์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋ฐ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์์ํด์ผํ๋๋ฐ, HO! HO!์ ๊ฐ์ ์์์ ๋น๊ต ์์ด๋ ๋น๊ตํ ์ ์์ต๋๋ค.
๋ฟก ๋นต๋จ
ๅ ถๅฎ ่ฟ ไธ่ฅฟ ่ท afc163์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฒ์ ่ฐ ๆง ๏ผ ๆฝ ๅฐ่ฏ ๆฏโ่ๅญ ๅๆฌข ๏ผ ไฝ ็ฑ ็จ ไธ็จโ
๊ธ๊ผด ๋์ SVG๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์์ด์ฝ ๊ธ๊ผด ๋์ ์์ด์ฝ์ React SVG ๊ตฌ์ฑ ์์ ์ฌ์ฉ
ํ์ฌ์์์ด ์ผ์ ํ ์ ์ด ์์ต๋๊น?
SVG๋ก Octicons ์ ๊ณต
์ง๊ธ ๋ฌธ์ ๋ ๋ฌด์์
๋๊น?
์ด์ ์์ด์ฝ์ cdn์ ์ํด๋ก๋ ๋ ๊ธ๊ผด์ ์ฌ์ฉํ๋ฉฐ ํฌ๊ธฐ๋ ๊ณต๊ธ ์
์ฒด์ ๋ฐ์๋์ง ์์ต๋๋ค. svg ์์ด์ฝ์ ํธ์คํ
ํ๊ธฐ์ํ ๊ธฐ๋ณธ cdn (๋ชจ๋ ์์ด์ฝ์ ์ฒญํฌ์ ๋ฃ๊ณ ์์ฒด cdn์ ์ฌ์ฉํ์ฌ ํธ์คํ
ํ ์ ์์)์ด ์์ต๋๋ค.์ด ๋ถ๋ถ์ ๊ณต๊ธ ์
์ฒด์ ๋ฐ์๋ฉ๋๋ค.
์ด๋ฒ ํธ์์ ๋
ผ์๋๋ ๊ฒ์ ํธ๋ฆฌ ์์ดํน์ ์ํํ๋ ๋ฐฉ๋ฒ, ์์ฒญ์ ์์ด์ฝ์๋ก๋ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ฉ๋ฉ ํ ์ ์๋ค๋ฉด ๋ชจ๋ ์์ด์ฝ์ ํ ๋ฒ์๋ก๋ํ์ธ์. ํผํ ์์๋ ์ต์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ฟก๋ฟก
3.9์ ๋ณ๊ฒฝ ๋ก๊ทธ๋ ๋งค์ฐ ๋น์ฐํธ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. SVG๋ก ๋ณ๊ฒฝ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ์ง ์์์ต๋๋ค. ๊ธ๊ผด์ ๋จ์ ๊ณผ ์ฅ์ ์ ๋ฌด์์
๋๊น?
btw ๋๋ svg (์ด์ ๊ฐ์ด viewBox ์ต๋ 1024 * 1024)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋ํ๋๋ฐ, ์ด๋ ๋ณตํฉ ๋ ์ด์ด ์์ ์์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ฆ๊ฐ๋ฅผ ์ ๋ฐํฉ๋๋ค.
@muzea https://ant.design/components/icon/#SVG -icons
@ afc163 ์ด๊ฒ์ ๋๋ฌด ์งง๊ณ SVG๋ก ๋ณ๊ฒฝํด์ผํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๊ด๊ณ์๋ svg๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ํ์์ ๋ฐ๋ผ ์์ด์ฝ์๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๋งํผ ์ถฉ๋ถํ ๋์ ๋๋ ์ค๋ช ์ํ์ง ์์์ผ๋ฉฐ, ์ด๊ฒ์ด ์ด๋ฒ ํธ์์ ๋ง์ ๋ถ์ ์ ์ธ ๊ฐ์ ์ ์์ธ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@muzea ์ ์ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค
์ ์ํฅ svg
์ ๋ฌํ ์ฑ๋ฅ์ svg
ๅ
ถๅญpath
๊ฒฝ๋ก ๊ทธ๋ฆฌ๊ธฐ ๋จธ๋ฆฌ. ํฉ์ฑ ๋ ์ด์ด์ ์๋์ด ์ค์ ๋ก ์ฆ๊ฐํ ์์ธ์ ํ์์
๋๋ค.
svg
์์ด์ฝ ์์ฒด (๋๋น ๋ฐ ๋์ด)๊ฐ ๋๋ฌด ํฌ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๋ฉด, ํฐ ์์ด์ฝ์ ์ค์ ๋ก ๋๋ก์์ ๋ณต์ก์ฑ์ ์ ๋ฐํ์ง๋ง ์๊ด ๊ณ์๋ ์๋์ ์ผ๋ก ๋ฎ์ต๋๋ค. ๋ณด์ฅ ํ ์์๋ ๊ฒ์ ๋์์ด๋๋ก๋ถํฐ ์ป์ ์์ด์ฝ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ์ฌ์ฉ์์์ธ์ง ๊ฒฝํ์ด ์ต๋ํ ํฅ์๋๊ณ (์์ด์ฝ์ด ํฌ๊ฒ ๋ณํ๋์ง ์์) ๊ฒฝ๋ก ์์ถ ๋ฐ ๊ด๋ จ ์ต์ ํ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ฉ๋๋ค. ๊ฐ์ฅ ํฐ ๋๋ต์ ์ธ ์ ๋ฐ๋. ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์ปดํฌ์ง์
๋ ์ด์ด์์ ๋ ๋๋ง๋๋๋กํ๋ ค๋ฉด svg sprite
์คํค๋ง๊ฐ ๊ณ ๋ ค๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํ์ด์ง์ ๋ถ์์ฉ์ด ์ถ๊ฐ๋ฉ๋๋ค (ํค๋ ๋๋ ๊ธฐํ ์์น์ ๊ด๋ จ ์ ์ ์ถ๊ฐ). ์ด๋ ์ ์ง ๋ณด์์ฑ ์ธก๋ฉด์์ ๋งค์ฐ ์ค์ํ๋ฉฐ ๋ค ์ฉ์ฑ ์๊ตฌ ์ฌํญ์ด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ๊ณ ๋ ค๋์ง ์์ ์ ์์ต๋๋ค.
์ฌ๋๋ค์ ์ด๋ค ์ํฉ์์ ์ธ์ ๋ฐ์๋งํ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ด์ฝ ์๋ฃจ์
์ผ๋ก svg
๋ฅผ ์ซ์ดํฉ๋๊น?
์ด ๋ฌธ์ ์ ๋ํ ๊ณต์์ ์ธ ํ์ ์กฐ์น์ ๋ถ์กฑ์ ์ค์ ๋ก ํ ๋น ์์ ํด๋นํ๋ ์ฌ๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์ง๋ง ๋ ์ด์ ํด๊ฒฐ๋์ง ์์ ๊ฒ์ ๋๋ค.
@ lizy0329 ์ด๋ค ์ฌ๋์ด ๋ค๋ฅธ ์ฌ๋์ ์ด๋ฌํ ํ๋์ ๋ํด ๊ธฐ๊บผ์ด ์ถ์ธกํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ ์์ ์ด๋ฉฐ ๋ค๋ฅธ ์ฌ๋์ ๊ฐ์ญ ํ ๊ถ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋์ด ์ฌ๋์ ์ฌ์ ํ โโํ๋ณด๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ ํ์ํฉ๋๋ค.
์๋
ํ์ธ์.
๋ฌธ์์ ์์ด์ฝ ๋ถ๋ถ์ ๋ด ๋ธ๋ผ์ฐ์ ์์ ์ฑ๋ฅ์ด ๋งค์ฐ ๋ฎ์ต๋๋ค.
์ค์ ๋ก osx์ ํฌ๋กฌ์ ํ์ด์ง์ antd ์์ด์ฝ์ด ๋ง์ ๋ ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋น ์ง ๊ฒ์
๋๋ค.
babel-plugin-macros
์ด (๊ฐ)์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๊น?
@ lizy0329 ์ด๋ค ์ฌ๋์ด ๋ค๋ฅธ ์ฌ๋์ ์ด๋ฌํ ํ๋์ ๋ํด ๊ธฐ๊บผ์ด ์ถ์ธกํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ ์์ ์ด๋ฉฐ ๋ค๋ฅธ ์ฌ๋์ ๊ฐ์ญ ํ ๊ถ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋์ด ์ฌ๋์ ์ฌ์ ํ โโํ๋ณด๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ ํ์ํฉ๋๋ค.
์ด๊ฒ์ ์ ์์ ์ธ ์ถ์ธก์ด ์๋๋ผ "๊ณตํต์ฑ ์ถ๊ตฌ"๋ผ๊ณ ํฉ๋๋ค. HO! HO! ์ฌ๊ณ ๋ ์ฐ์ฐํ ๋ฐ์ํ ๊ฒ์ด ์๋๋ผ ์ฅ๊ธฐ๊ฐ ์ถ์ ๋ ๊ฒ์์ ํ๋ฆผ ์๋ค. ๋๋ ๋๋ฅผ ๋น๋ฐฉํ์ง ์๊ณ antd๊ฐ ๋ ์ ๋ฐ์ ํ๊ธฐ๋ฅผ ์ํ๋ฉฐ ๊ฐ ์ ๋ฐ์ดํธ์ ๊ฒฐ๊ณผ์ ํด๊ฒฐ์ฑ ์ ๋ํด ์๊ฐํฉ๋๋ค.
๊ทธ๋์ ์ธ์ ์ด๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๊น? ๋๋ ํ๋ก์ ํธ์์ antd๋ฅผ ์ฌ์ฉํ๊ณ ์๋ฌด๊ฒ๋ํ์ง ์์๊ธฐ ๋๋ฌธ์ Button์ ๊ฐ์ ธ ์๊ณ ํจํค์ง ๋ฒ๋ค์ด 177k์์ 1.1m๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ๋ถ์๊ธฐ๊ฐ ๊ทธ๊ฒ์ ๋ณด์๊ณ ์์ด์ฝ๋์์์ต๋๋ค.
๋ฒ๋ค์ ์ฌ์ฉํ์ง ์์ ๋ ๋ฒ๋ค์์ ์์ด์ฝ์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
create-react-app๊ณผ ํจ๊ป ์ฌ์ ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ :
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
}),
antd@3
๋ํ @ qaiser110 ์ ์๋ฃจ์
์ ํ์ธํด์ผํฉ๋๋ค.
antd
์์ค๊ฐ ๋ชจ๋ ์์ด์ฝ ์ @ant-design/icons/lib/dist
๊ฐ์ ธ ์ค๊ธฐ๋ฅผ @ant-design/icons
์์ ์ ํํ ์์ด์ฝ์ด์๋ ์ฌ์ฉ์ ์ง์ ํ์ผ๋ก ๋ฆฌ๋๋ ์
ํ๊ธฐ ์ํด webpack resolve.alias
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
ํฐ ๋ฒ๋ค์ ๊ฐ๋ ๊ฒ๋ณด๋ค ๋ซ์ง ๋ง ์์ด์ฝ์ ์๋์ผ๋ก ์ ํํด์ผํ๋ฏ๋ก ์ฌ์ ํ ์ด์์ ์ด์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์์ ๋ฐ๋ผ ์ฒด๋ฆฌ๋ฅผ ์ ํํฉ๋๋ค (์์ด์ฝ์ด์๋ ๊ฒฝ์ฐ). ์ ํํด์ผ ํ ํญ๋ชฉ์ ํ์
ํ๋ ค๋ฉด antd
๋ฐ ์ฌ์ฉ ๋ ์์ด์ฝ์ ๋ํ ์์ค ์ฝ๋๋ฅผ ๊ฒ์ ํ ์ ์์ต๋๋ค.
antd
์์ค์์ ์ ํํ ์์ด์ฝ ํจํค์ง ๋ ๊ณต์ ํ์ผ์ด ์๋ค๋ฉด ์ ์ฉ ํ ๊ฒ์
๋๋ค. ์ด๋ฐ ์์ผ๋ก ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ์ ์์ค๋ฅผ ์ํด ์ฒด๋ฆฌ ๋ฐ๊ธฐ์ ๋ํด์๋ง ๊ฑฑ์ ํ๋ฉด๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์์ด๋์ด ์์ ์ด ์์ต๋๋ค. antd ๊ตฌ์ฑ ์์๊ฐ ๋ด๋ณด๋ด๋ ์์ด์ฝ์ ๊ทธ๋ฃนํํ์ฌ ์๋์ผ๋ก antd ์์ค๋ฅผ ํ์ธํ๋ ๋์ ์ฌ์ฉ์ ์ ์ ์์ด์ฝ ํ์ผ์์ export * from 'antd-cherry-pick-icons/icon'
๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฅํ ํ antd
์์ค๋ก ์ต์ ์ํ๋ก ์ ์งํ๋ ค๋ ์ปค๋ฎค๋ํฐ ๋
ธ๋ ฅ์ผ๋ก ์ํ ํ ์ ์์ต๋๋ค.
@LucasBassetti , ์์ด์ฝ์ด ํ์ํ์ง ์์ต๋๊น? <Icon />
์ง์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ผ๋ถ antd
๊ตฌ์ฑ ์์๋`<Alert />
.
antd 4.0 (์ํ) ์ ์์ผ๋ ์นด๋ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์ ์ผ๋ก์จ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋์ ๊ทธ๋ค์ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํ ์์ ํ์ ์ ํํฉ๋๋ค .
์์ ๋ ๋๊น์ง ๋๋ฅผ ์ํด ์ผํ ์์ ์๋ฃจ์ (antd> = 3.9)
- ์์ด์ฝ์ ๋ค๋ฅด๊ฒ ํด๊ฒฐํ๋ ค๋ฉด ์นํฉ์ ์กฐ์ ํ์ญ์์ค. ์นํฉ ๊ตฌ์ฑ์์ :
module.exports = { //... resolve: { alias: { "@ant-design/icons/lib/dist$": path.resolve(__dirname, "./src/icons.js") } } };
- ๋ง๋ค๊ธฐ
icons.js
ํด๋์src/
์ด๋๋ ์ง ์ํ๋. ๋ณ์นญ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค!
์ด ํ์ผ์์ antd๊ฐ ํฌํจํด์ผํ๋ ์์ด์ฝ์ ์ ์ํฉ๋๋ค! antd์ Select ๊ตฌ์ฑ ์์์๋ ์๋๋ก ์์ด์ฝ ๋ง ํ์ํ์ต๋๋ค.export { default as DownOutline } from "@ant-design/icons/lib/outline/DownOutline";
config-overwrites.js
๋ด์์react-app-rewire
(create-react-app ์์ )์ผ๋ก์ด ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
config-overwrites.js
์ฐพ๋ ์ฌ๋์ด ์๋ค๋ฉด
const { override, fixBabelImports, addWebpackAlias } = require('customize-cra');
const rewireCompressionPlugin = require('react-app-rewire-compression-plugin');
const rewireUglifyjs = require('react-app-rewire-uglifyjs');
const path = require('path');
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: 'css',
}),
addWebpackAlias({
['@ant-design/icons/lib/dist$']: path.resolve(__dirname, './src/client/icons.js')
}),
rewireUglifyjs,
rewireCompressionPlugin
);
@adinnc ์์ด์ฝ ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋์ด ๋ ์ด์ @ant-design/icons/lib/outline/DownOutline
์๋
๋งํฌ๋์ด ๋ฌธ์ ์ ์ธ์ฌํ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ์์ผ๋ฉฐ ํ์ฌ๋ antd 3๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ฒํผ์ด ์๊ฐ๋๊ณ ์์ต๋๋ค. ์๊ฐ๊ณผ ์์ด์ฝ์ ์ฐ๊ฒฐํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค. ์์ด์ฝ ํ์ผ ๋ง 500k ์ด์์ ๋๋ค.
@DemonCloud ์๊ฐ์ ๋ฌธ์ ๋ https://github.com/ant-design/babel-plugin-import/issues/352์์ ์ฃผ๋ชฉํ ์
react-app-rewired ๋ฅผ ํตํด create-react-app ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์
config-overrides.js
Const path = require ( ' path ' ); /* config-overrides.js */ module . exports = function override ( config , env ) { let alias = ( config . resolve . alias || {}); Alias[ ' @ant-design/icons/lib/dist$ ' ] = path . resolve ( __dirname , " ./src/icons.js " ); Config . resolve . alias = alias; Return config; }
icons.js
์์
์ด์ ๋ ํ์คํ์ง ์์ง๋ง icons.js๋ฅผ ์ฌ์ฉํ ํ ๋ฒ๋ค์ด 600KB ์ฆ๊ฐํฉ๋๋ค.
๋ด ์ฝ๋์์์ด ํจํค์ง๋ฅผ ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ผ ์๋ ์์ต๋๋ค. https://www.npmjs.com/package/html-webpack-inline-source-plugin
config-override.js
๊ณผ ๊ฐ์ด ํธ์งํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ 500KB ์ค์์ต๋๋ค.
config-override.js
const { override, fixBabelImports } = require('customize-cra');
const path = require('path');
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: 'css'
}),
// used to minimise bundle size by 500KB
function(config, env) {
const alias = config.resolve.alias || {};
alias['@ant-design/icons/lib/dist$'] = path.resolve(__dirname, './src/icons.js');
config.resolve.alias = alias;
return config;
}
);
./src/icons.js
/**
* List all antd icons you want to use in your source code
*/
export {
default as SearchOutline
} from '@ant-design/icons/lib/outline/SearchOutline';
export {
default as CloseOutline
} from '@ant-design/icons/lib/outline/CloseOutline';
export {
default as QuestionCircleOutline
} from '@ant-design/icons/lib/outline/QuestionCircleOutline';
export {
default as PlayCircleOutline
} from '@ant-design/icons/lib/outline/PlayCircleOutline';
export {
default as PauseCircleOutline
} from '@ant-design/icons/lib/outline/PauseCircleOutline';
export {
default as LoadingOutline
} from '@ant-design/icons/lib/outline/LoadingOutline';
config-override.js
๊ณผ ๊ฐ์ด ํธ์งํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ 500KB ์ค์์ต๋๋ค.config-override.js
const { override, fixBabelImports } = require('customize-cra'); const path = require('path'); module.exports = override( fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', style: 'css' }), // used to minimise bundle size by 500KB function(config, env) { const alias = config.resolve.alias || {}; alias['@ant-design/icons/lib/dist$'] = path.resolve(__dirname, './src/icons.js'); config.resolve.alias = alias; return config; } );
./src/icons.js
/** * List all antd icons you want to use in your source code */ export { default as SearchOutline } from '@ant-design/icons/lib/outline/SearchOutline'; export { default as CloseOutline } from '@ant-design/icons/lib/outline/CloseOutline'; export { default as QuestionCircleOutline } from '@ant-design/icons/lib/outline/QuestionCircleOutline'; export { default as PlayCircleOutline } from '@ant-design/icons/lib/outline/PlayCircleOutline'; export { default as PauseCircleOutline } from '@ant-design/icons/lib/outline/PauseCircleOutline'; export { default as LoadingOutline } from '@ant-design/icons/lib/outline/LoadingOutline';
์ ์
ํ
๊ฐ์ฌํฉ๋๋ค! ๊ทธ๊ฒ์ ๋๋ฅผ ๋์๋ค!
@adinnc ์์ด์ฝ ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋์ด ๋ ์ด์
@ant-design/icons/lib/outline/DownOutline
์๋
์ด๋ด, ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๊น? ๋๋ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค
์ฌ๊ธฐ์ ํ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ ๋ง ์์ต๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉํ๋ ์์ด์ฝ ๋ง ๊ฐ์ ธ ์ค๋ ๊ฒ์ด ํจ์ฌ ์ฝ๊ณ ๊น๋ํ์ง ์์๊น์? ์ด๊ฒ์ ๊ทผ๋ณธ ์์ธ์ ํด๊ฒฐํ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ๊ฐ ๋์ ๋ช ๋ช ๋ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๊ฒ์ด ๋๋ฌด ์ด๋ ต์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํฉ๋๋ค.
@Nomeasmo , ๋ก๋๋งต ์ ๋ฐ๋ผ v4์์ ์์ ๋์ด์ผํฉ๋๋ค.
3.X์ ์์ ์ฌํญ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ฐ๋ฅํ๋ฉด 4๋ก ์ ๊ทธ๋ ์ด๋ ํ ๊ณํ์ด ์์ต๋๋ค.
๋ฒํผ๊ณผ ๊ฐ์ ๋จ์ํ ๊ฒ์ ๋ํ CSS๊ฐ ๋๋ฌด ๋ณต์กํ๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ด ๋ถ์กฑํ๊ณ , ํจ์น ์ ๋ฐ์ดํธ์กฐ์ฐจ๋ 1,000 ๊ฐ์ ๊ฐ๊น์ด ์ปค๋ฐ์ผ๋ก ์ฑ์์ง๊ธฐ ๋๋ฌธ์ ์ธ์ ๊ฐ Ant์์ ์์ ํ ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ด ์ทจํฅ์ ๋นํด ๋๋ฌด ๋ง์ ์ดํ์ ๋๋ค.
ํ
react-app-rewired ๋ฅผ ํตํด create-react-app ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์
config-overrides.js
const path = require ( ' path ' ); / * config-overrides.js * / module . exports = function override ( config , env ) { let alias = ( config . resolve . alias || (}); alias [ ' @ ant-design / icons / lib / dist $ ' ] = path . resolve ( __dirname , " ./src/icons.js " ); config . resolve . alias = alias; return config; }
icons.js
์์
์๋ํ์ง ์์ ์ฌ์ ํ ์์ด์ฝ์ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ๋์ต๋๋ค.
v4.0.0-beta.0์์ ์์ด์ฝ์ ๋ํ ํธ๋ฆฌ ํ๋ค๋ฆผ์ด ์์์์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ด์ฝ ๋ฒ๋ค์ ์ฑ๊ณต์ ์ผ๋ก ์ถ์ ํ ์ฌ๋์ด ์์ต๋๊น? ๊ตฌ์ฑ์ ๊ณต์ ํ ์ ์์ต๋๊น?
๋์ค์ v4.0.0-beta.1์ ์๋ํ๊ณ @ant-design/compatible
ํจํค์ง๋ฅผ ์ ๊ฑฐํ์ง๋ง ๋ชจ๋ ์์ด์ฝ์ ์ฌ์ ํ โโ๋ฒ๋ค์ ํฌํจ๋์ด ์์ต๋๋ค.
react-app-rewired ๋ฅผ ํตํด create-react-app ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์
config-overrides.js
const path = require ( ' path ' ); / * config-overrides.js * / module . exports = function override ( config , env ) { let alias = ( config . resolve . alias || (}); alias [ ' @ ant-design / icons / lib / dist $ ' ] = path . resolve ( __dirname , " ./src/icons.js " ); config . resolve . alias = alias; return config; }
icons.js
์์ ์๋ํ์ง ์์ ์ฌ์ ํ ์์ด์ฝ์ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ๋์ต๋๋ค.
https://github.com/ant-design/ant-design/issues/12011#issuecomment -552117531์ฒ๋ผ ๊ฐ์ ธ์์ผํ๋ ์์ด์ฝ์ ํฌํจํ๋ ค๋ฉด icons.js ํ์ผ์ด ํ์ํฉ๋๋ค.
์์ ๋ ๋๊น์ง ๋๋ฅผ ์ํด ์ผํ ์์ ์๋ฃจ์ (antd> = 3.9)
- ์์ด์ฝ์ ๋ค๋ฅด๊ฒ ํด๊ฒฐํ๋ ค๋ฉด ์นํฉ์ ์กฐ์ ํ์ญ์์ค. ์นํฉ ๊ตฌ์ฑ์์ :
module.exports = { //... resolve: { alias: { "@ant-design/icons/lib/dist$": path.resolve(__dirname, "./src/icons.js") } } };
- ๋ง๋ค๊ธฐ
icons.js
ํด๋์src/
์ด๋๋ ์ง ์ํ๋. ๋ณ์นญ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค!
์ด ํ์ผ์์ antd๊ฐ ํฌํจํด์ผํ๋ ์์ด์ฝ์ ์ ์ํฉ๋๋ค! antd์ Select ๊ตฌ์ฑ ์์์๋ ์๋๋ก ์์ด์ฝ ๋ง ํ์ํ์ต๋๋ค.export { default as DownOutline } from "@ant-design/icons/lib/outline/DownOutline";
config-overwrites.js
๋ด์์react-app-rewire
(create-react-app ์์ )์ผ๋ก์ด ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
config-overwrites.js
์ฐพ๋ ์ฌ๋์ด ์๋ค๋ฉดconst { override, fixBabelImports, addWebpackAlias } = require('customize-cra'); const rewireCompressionPlugin = require('react-app-rewire-compression-plugin'); const rewireUglifyjs = require('react-app-rewire-uglifyjs'); const path = require('path'); module.exports = override( fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', style: 'css', }), addWebpackAlias({ ['@ant-design/icons/lib/dist$']: path.resolve(__dirname, './src/client/icons.js') }), rewireUglifyjs, rewireCompressionPlugin );
๋ด ๋ฒ๋ค์ 700kb์์ 200kb๋ก ์ค์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
v4.0.0-beta.0์์ ์์ด์ฝ์ ๋ํ ํธ๋ฆฌ ํ๋ค๋ฆผ์ด ์์์์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ด์ฝ ๋ฒ๋ค์ ์ฑ๊ณต์ ์ผ๋ก ์ถ์ ํ ์ฌ๋์ด ์์ต๋๊น? ๊ตฌ์ฑ์ ๊ณต์ ํ ์ ์์ต๋๊น?๋์ค์ v4.0.0-beta.1์ ์๋ํ๊ณ
@ant-design/compatible
ํจํค์ง๋ฅผ ์ ๊ฑฐํ์ง๋ง ๋ชจ๋ ์์ด์ฝ์ ์ฌ์ ํ โโ๋ฒ๋ค์ ํฌํจ๋์ด ์์ต๋๋ค.
์ ๋ฐ์ดํธ ๋ ์์ด์ฝ ๊ฐ์ ธ ์ค๊ธฐ์๋ ๋ถ๊ตฌํ๊ณ 4.0.0-rc.0์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ ํจ
@jhockett ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค! ์ผ๋ถ ์์
ํ์ด ํธ๋ฆฌ ์์ดํน ํ๋ก์ธ์ค๋ฅผ ๊นจ๊ณ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ : _import Text from 'antd / lib / typography / Text'; _
๋๋ ๊ทธ๊ฒ์ 'antd'; _์์ _import {Typography}๋ก ๋ฐ๊พธ์๊ณ ์์ด์ฝ์ ๋ด ๋ฒ๋ค์ ๋ ๋ฌ์ต๋๋ค!
@jhockett ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค! ์ผ๋ถ ์์ ํ์ด ํธ๋ฆฌ ์์ดํน ํ๋ก์ธ์ค๋ฅผ ๊นจ๊ณ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ : _import Text from 'antd / lib / typography / Text'; _
๋๋ ๊ทธ๊ฒ์ 'antd'; _์์ _import {Typography}๋ก ๋ฐ๊พธ์๊ณ ์์ด์ฝ์ ๋ด ๋ฒ๋ค์ ๋ ๋ฌ์ต๋๋ค!
๋ด ๋ชจ๋ ant ๋์์ธ ๊ฐ์ ธ ์ค๊ธฐ๋ ์ธ๊ธ ํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. _import {Typography} from 'antd'; _
๊ทธ๋์ ์ด๊ฒ์ ๋ด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ํฅ์๋ฐ์ ์ ์์ต๋๋ค!
์์ ๋ ๋๊น์ง ๋๋ฅผ ์ํด ์ผํ ์์ ์๋ฃจ์ (antd> = 3.9)
- ์์ด์ฝ์ ๋ค๋ฅด๊ฒ ํด๊ฒฐํ๋ ค๋ฉด ์นํฉ์ ์กฐ์ ํ์ญ์์ค. ์นํฉ ๊ตฌ์ฑ์์ :
module.exports = { //... resolve: { alias: { "@ant-design/icons/lib/dist$": path.resolve(__dirname, "./src/icons.js") } } };
- ๋ง๋ค๊ธฐ
icons.js
ํด๋์src/
์ด๋๋ ์ง ์ํ๋. ๋ณ์นญ ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค!
์ด ํ์ผ์์ antd๊ฐ ํฌํจํด์ผํ๋ ์์ด์ฝ์ ์ ์ํฉ๋๋ค! antd์ Select ๊ตฌ์ฑ ์์์๋ ์๋๋ก ์์ด์ฝ ๋ง ํ์ํ์ต๋๋ค.export { default as DownOutline } from "@ant-design/icons/lib/outline/DownOutline";
config-overwrites.js
๋ด์์react-app-rewire
(create-react-app ์์ )์ผ๋ก์ด ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
config-overwrites.js
์ฐพ๋ ์ฌ๋์ด ์๋ค๋ฉดconst { override, fixBabelImports, addWebpackAlias } = require('customize-cra'); const rewireCompressionPlugin = require('react-app-rewire-compression-plugin'); const rewireUglifyjs = require('react-app-rewire-uglifyjs'); const path = require('path'); module.exports = override( fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', style: 'css', }), addWebpackAlias({ ['@ant-design/icons/lib/dist$']: path.resolve(__dirname, './src/client/icons.js') }), rewireUglifyjs, rewireCompressionPlugin );
๋ด ๋ฒ๋ค์ 700kb์์ 200kb๋ก ์ค์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
์ด๊ฒ์ ์ฌ์ฉํ ๋ ์๋ํ์ง ์์ต๋๋ค. ๋ค์์ ๋ฌด์์ ํ ์ ์์ต๋๊น?
Parcel.js๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋ค์ ์์ ์ด ํจ๊ณผ์ ์ด์์ต๋๋ค.
npm install purched-antd-icons
๊ทธ๋ฆฌ๊ณ package.json
:
"alias": {
"@ant-design/icons": "purched-antd-icons"
}
v4.0.0-beta.0์์ ์์ด์ฝ์ ๋ํ ํธ๋ฆฌ ํ๋ค๋ฆผ์ด ์์์์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ด์ฝ ๋ฒ๋ค์ ์ฑ๊ณต์ ์ผ๋ก ์ถ์ ํ ์ฌ๋์ด ์์ต๋๊น? ๊ตฌ์ฑ์ ๊ณต์ ํ ์ ์์ต๋๊น?๋์ค์ v4.0.0-beta.1์ ์๋ํ๊ณ
@ant-design/compatible
ํจํค์ง๋ฅผ ์ ๊ฑฐํ์ง๋ง ๋ชจ๋ ์์ด์ฝ์ ์ฌ์ ํ โโ๋ฒ๋ค์ ํฌํจ๋์ด ์์ต๋๋ค.
babel-plugin-import
์ด์ ๊ฐ์ด ๋ณ๊ฒฝํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
{ "libraryName": "antd", + "libraryDirectory": "es", "style": true },
https://github.com/ant-design/ant-design/issues/12011#issuecomment -552117531์์ ์๊ฐ์ ์ป์ antd@4
(https://github.com/ant-design/ant -design / issues / 20661).
๋ค์ resolve.alias
์ webpack
๊ตฌ์ฑ์ ์ถ๊ฐํฉ๋๋ค ( customize-cra
์๋ ์๋ํด์ผ ํจ).
// [...]
config.resolve.alias = {
"@ant-design/icons$": resolve(__dirname, "path/to/your/src/icons.tsx")
};
// [...]
icons.tsx
์ ๋ค์๊ณผ ๊ฐ์์ผํฉ๋๋ค.
/**
* Provide all needed icons from antd. This file is associated to the webpack.config.js resolve.alias.
*/
export { default as LoadingOutlined } from "@ant-design/icons/LoadingOutlined";
์๋ฅผ ๋ค์ด Button
๊ตฌ์ฑ ์์์๋ ์์ LoadingOutlined
์์ด์ฝ์ด ํ์ํฉ๋๋ค. ํด๋น ํ์ผ์ ํ์ํ ๋ชจ๋ ์์ด์ฝ์ ์ถ๊ฐํ์ญ์์ค. ๋ํ ํด๋น ํ์ผ์ ์ฌ์ฌ์ฉ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ @ant-design/icons
์์ ์ง์ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๊ทํ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
import { LoadingOutlined } from "./icons";
import { LoadingOutlined } from "@ant-design/icons";
@matzeeable ์ ์ ์๋ฃจ์
์ด ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. icons.tsx
์ด๋ค ์์ด์ฝ์ ํฌํจํด์ผํ๋์ง ์ ์์๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ : InputNumber ๋ฐ Select ๋๋กญ ๋ค์ด๊ณผ ๊ฐ์ ์์ ์์๊ฐ ์์ต๋๋ค. ํํธ๊ฐ ์์ผ์ญ๋๊น?
icons.tsx
์ด๋ค ์์ด์ฝ์ ํฌํจํด์ผํ๋์ง ์ ์์๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ : InputNumber ๋ฐ Select ๋๋กญ ๋ค์ด๊ณผ ๊ฐ์ ์์ ์์๊ฐ ์์ต๋๋ค. ํํธ๊ฐ ์์ผ์ญ๋๊น?
@ pradeepb6 antd
์์ ์์ค์ ์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. Webpack์ ์์ด์ฝ ํด๊ฒฐ์ ์๋ํ์ง๋ง icons.tsx
์ ์ํ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ช
๋ช
๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค.
๋์ค์ ๊ตฌ์ฑ ์์๊ฐ ์์๋๋ก ์๋ํ๋๋ก icons.tsx
์์ ๋ด ๋ณด๋ด์ผํ๋ ์์ด์ฝ์ ์ ์ ์์ต๋๋ค. ๐
@matzeeable ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋ํ๋ค. ํ์ง๋ง ์คํฌ๋ฆฐ ์ท๊ณผ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฝ๋๋ ์ฌ๊ธฐ ์์ ์ฐพ์ ์
๋๋ ์ด๋ฏธ babel-plugin-import github์ ๊ธ์ ์ผ์ง ๋ง, ์ฌ๊ธฐ์์๋ ๋๊ตฐ๊ฐ๊ฐ ๋ ๋ง์ ์ฌ๋๋ค์ด ์ฌ๊ธฐ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๋ค. V4๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ณ ํฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๊ด์ฐฐํ๊ณ ์์ต๋๋ค.
https://github.com/ant-design/ant-design/issues/12011#issuecomment -577513378์ ์ด๋๋ก "libraryDirectory": "es"
๋ฅผ ์ถ๊ฐํ๋ฉด ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
[ error ] /home/maciek/Dokumenty/websites/bookingapp/frontend/node_modules/antd/es/notification/index.js:3
import * as React from 'react';
^
SyntaxError: Unexpected token *
at Module._compile (internal/modules/cjs/loader.js:723:23)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.antd/es/notification (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:10975:18)
at __webpack_require__ (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:23:31)
at Module../lib/withData.js (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:8200:78)
at __webpack_require__ (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:23:31)
at Module../pages/_app.js (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:10614:71)
at __webpack_require__ (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:23:31)
at Object.0 (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:10754:18)
at __webpack_require__ (/home/maciek/Dokumenty/websites/bookingapp/frontend/.next/server/static/development/pages/_app.js:23:31)
at
next.js btw๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ถ๋ฐ :
"@ant-design/compatible": "0.0.1-rc.1",
"@ant-design/icons": "^4.0.0-rc.0",
"antd": "^4.0.0-rc.3",
"babel-plugin-import": "^1.13.0",
๋๊ตฐ๊ฐ?
@ afc163 ์ ํ์ต๋๋ค . IssueHunt์์๋ณด๊ธฐ
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ @chemicalkosek, [email protected]
+ next.js
ํ์ฌ esm์ ์ํด ํด๊ฒฐ๋์์ต๋๋ค.
yarn add esm
"scripts": {
"dev": "NODE_OPTIONS=\"-r esm\" next",
"build": "NODE_OPTIONS=\"-r esm\" next build",
"start": "NODE_OPTIONS=\"-r esm\" next start"
}
๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :)
@ i-tengfei ์์ฐ, ์๋ํฉ๋๋ค! ๋๋จํ ๊ฐ์ฌํฉ๋๋ค!
antd @ 4์ ๊ฒฝ์ฐ ์ด์ @ ant-design / icons ํจํค์ง๋ฅผ ๋ฎ์ด ์ฐ๊ณ antd ์์ด์ฝ์ fontawesome ์์ด์ฝ์ผ๋ก ๋์ฒดํ๋ ์์ฒด ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
antd์ ํ์ํ ์์ด์ฝ ๋ง ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํธ๋ฆฌ ์์ดํน์ ํ์ฑํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด an-design / icons ํจํค์ง๊ฐ ํฌํจ๋์์ต๋๋ค.
[email protected]๋ก ์ ๊ทธ๋ ์ด๋ํ์ญ์์ค.์ด ๋ฌธ์ ๋ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋์์ต๋๋ค.
Parcel.js๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ๋ ๋ค์ ์์ ์ด ํจ๊ณผ์ ์ด์์ต๋๋ค.
npm install purched-antd-icons
๊ทธ๋ฆฌ๊ณ
package.json
:"alias": { "@ant-design/icons": "purched-antd-icons" }
๊ฐ์ฌํฉ๋๋ค, ์๋ํฉ๋๋ค!
@ afc163 @yesmeck ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐํ ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค. ํ๋ฐํธ ์๋๋ ์ด๋ป๊ฒ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋ AppstoreOutlined
).
const iconStr = res.icon // ๆๅกๅจ่ฟๅ็ๆฐๆฎๅๅฆ
const Icon = React.lazy(() => import(`@ant-design/icons/${iconStr}`))
// render
<Icon />
๊ทธ๋ฌ๋ ์ง๊ธ์ ์ง์ ์ปดํ์ผํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.๋์ ๋ก๋ฉ์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฟก๋ฟก
[email protected]๋ก ์ ๊ทธ๋ ์ด๋ํ์ญ์์ค.์ด ๋ฌธ์ ๋ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋์์ต๋๋ค.
20661
๋๋ ๊ทธ๊ฒ์ด ํด๊ฒฐ๋์๋์ง ์ ํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํจํค์ง์๋ ์ฌ์ ํ ๋ชจ๋ ์์ด์ฝ ๋ฒ๋ค์ด ์์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ ์์ด์ฝ์ ๊ฐ์ ธ ์์ต๋๋ค.
"@ ant-design / icons": "^ 4.0.6" ๋ฐ ์นํฉ 4.43.0 ์ฌ์ฉ
์ด ๊ตฌ์ฑ๋ ๊ฐ์ง๊ณ
{
"libraryName": "antd",
+ "libraryDirectory": "es",
"style": true
},
import {DeleteOutlined, EditOutlined, WarningTwoTone} from "@ant-design/icons";
@ afc163 @yesmeck ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐํ ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค. ํ๋ฐํธ ์๋๋ ์ด๋ป๊ฒ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋
AppstoreOutlined
).const iconStr = res.icon // ๆๅกๅจ่ฟๅ็ๆฐๆฎๅๅฆ const Icon = React.lazy(() => import(`@ant-design/icons/${iconStr}`)) // render <Icon />
๊ทธ๋ฌ๋ ์ง๊ธ์ ์ง์ ์ปดํ์ผํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.๋์ ๋ก๋ฉ์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด๋์ด์ผํ๋ค๊ณ ์๊ฐํ๋ค
์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ฉด ์์ธ์ ๋ ์ ํ๋จ ํ ์ ์์ต๋๋ค.
babel-plugin-import
ํ์ฌ ํฌ๊ธฐ๋ฅผ 500kb ์ด์์์ ์ค
['import', {
libraryName: '@ant-design/icons',
libraryDirectory: '', // defaults to 'lib'
camel2DashComponentName: false // defaults to true
}]
import {
DesktopOutlined,
FileOutlined,
PieChartOutlined,
TeamOutlined,
UserOutlined,
} from '@ant-design/icons'
๋ฟก๋ฟก
[
"import",
{
"libraryName": "@ant-design/icons",
"libraryDirectory": "es/icons",
"camel2DashComponentName": false
},
"@ant-design/icons"
],
@ mit123suki @nwoeddie ์ ์
const webpack = require("webpack");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const CopyWebpackPlugin = require("copy-webpack-plugin");
const ProgressBarPlugin = require("progress-bar-webpack-plugin");
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
var LodashModuleReplacementPlugin = require("lodash-webpack-plugin");
const AntdDayjsWebpackPlugin = require("antd-dayjs-webpack-plugin");
const path = require("path");
let dev = {
mode: "development",
optimization: {
usedExports: true,
noEmitOnErrors: true
},
entry: [
path.resolve(__dirname, "./src/index.tsx")
],
output: {
path: path.resolve(__dirname, "./public"),
publicPath: "/",
filename: "[name].js"
},
target: "web",
devServer: {
// writeToDisk: true,
historyApiFallback: true, // catch all 404
port: 8080,
hot: true,
proxy: {
"/backend": {
target: "http://localhost:4000",
pathRewrite: { "^/backend": "" }
},
"/runner": {
target: "http://localhost:4001",
pathRewrite: { "^/runner": "" }
}
}
},
devtool: "cheap-module-eval-source-map",
resolve: {
alias: {
"react-dom": "@hot-loader/react-dom"
},
extensions: [".js", ".jsx", ".less", ".tsx", ".ts"]
},
plugins: [
new LodashModuleReplacementPlugin(),
new AntdDayjsWebpackPlugin(),
new CopyWebpackPlugin([{ from: path.join(__dirname, "./static"), to: "./" }]),
new ProgressBarPlugin(),
new ForkTsCheckerWebpackPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.DefinePlugin({
"process.env.ENV": JSON.stringify("dev"),
}),
new BundleAnalyzerPlugin({
"openAnalyzer": true,
analyzerPort: 8889
})
],
module: {
rules: [
{
test: /\.(tsx|ts)$/,
use: [
{
loader: "ts-loader",
options: {
transpileOnly: true
}
}
],
exclude: /node_modules/
}
, {
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
"presets": [
[
"@babel/preset-env",
{
"targets": "defaults",
"modules": false
}
],
[
"@babel/preset-react"
]
],
plugins: [
"@babel/plugin-transform-runtime",
["import",
{ "libraryName": "antd", "style": false, "libraryDirectory": "es" }, "antd"],
["import",
{
"libraryName": "@ant-design/icons",
// "style": false,
"libraryDirectory": "es/icons",
"camel2DashComponentName": false
}, "@ant-design/icons"],
"react-hot-loader/babel"
]
}
}
},
{
test: /\.less$/,
use: [
{
loader: "style-loader"
},
{
loader: "css-loader",
options: {
sourceMap: true
}
},
{
loader: "less-loader",
options: {
sourceMap: true,
javascriptEnabled: true
}
}]
},
{
test: /\.(png|jpg|gif|svg|ico)$/,
use: [
{
loader: "file-loader"
}
]
},
{
test: /\.css$/,
use: [
"style-loader",
"css-loader"
]
}
]
},
};
module.exports = dev;
@ afc163 @yesmeck ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐํ ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค. ํ๋ฐํธ ์๋๋ ์ด๋ป๊ฒ ๋น๋๊ธฐ ์ ์ผ๋ก๋ก๋
AppstoreOutlined
).const iconStr = res.icon // ๆๅกๅจ่ฟๅ็ๆฐๆฎๅๅฆ const Icon = React.lazy(() => import(`@ant-design/icons/${iconStr}`)) // render <Icon />
๊ทธ๋ฌ๋ ์ง๊ธ์ ์ง์ ์ปดํ์ผํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.๋์ ๋ก๋ฉ์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
{Icon}์ผ๋ก ๋ณ๊ฒฝํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ฉด ์์ธ์ ๋ ์ ํ๋จ ํ ์ ์์ต๋๋ค.
Failed to compile.
./node_modules/@ant-design/icons/dist/icons/index.d.ts
Module not found: Can't resolve './AccountBookFilled' in '/Users/andy/Projects/shop-platform/node_modules/@ant-design/icons/dist/icons'
@Xezzon ์ ์ฒซ ๋ฒ์งธ ์์ด์ฝ ๋ชจ๋์ ์ฐพ์ ์
๋ฟก๋ฟก
[ "import", [ { libraryName: 'antd', style: true }, { "libraryName": "@ant-design/icons", "libraryDirectory": "es/icons", "camel2DashComponentName": false }] ],
"babel-loader": "^ 7.1.5"
"babel-plugin-import": "^ 1.13.0"
์๋ ํ์ธ์, nwoeddie ~ !, ๋ด ๊ตฌ์ฑ์ด ์๋ํ์ง ์์ต๋๋ค. ๋จ์ผ ๊ฐ์ ธ ์ค๊ธฐ ์ต์ ์ ๋ถํ ํ์ง๋ง ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ํ ๊ตฌ์ฑ์ ๋ฐฐ์ธ ์ ์์ต๋๊น?
์ด aritcle์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค : https://www.cnblogs.com/fulu/p/13255538.html
๋ฟก๋ฟก
[ "import", [ { libraryName: 'antd', style: true }, { "libraryName": "@ant-design/icons", "libraryDirectory": "es/icons", "camel2DashComponentName": false }] ],
"babel-loader": "^ 7.1.5"
"babel-plugin-import": "^ 1.13.0"์๋ ํ์ธ์, nwoeddie ~ !, ๋ด ๊ตฌ์ฑ์ด ์๋ํ์ง ์์ต๋๋ค. ๋จ์ผ ๊ฐ์ ธ ์ค๊ธฐ ์ต์ ์ ๋ถํ ํ์ง๋ง ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ํ ๊ตฌ์ฑ์ ๋ฐฐ์ธ ์ ์์ต๋๊น?
์ด๊ฒ์ babel 7์ ์ฌ๋ฐ๋ฅธ ๊ตฌ๋ฌธ์ด ์๋๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ ํ๋ฌ๊ทธ์ธ์ ๋ฐฐ์ด์ ์ง์ํ์ง ์์ต๋๋ค. ์ณ์ ๊ธธ:
["import", { "libraryName": "antd", "libraryDirectory": "es", "style": true}, "ant"],
["import", {
"libraryName": "@ant-design/icons",
"libraryDirectory": "es/icons",
"camel2DashComponentName": false
}, "ant-design-icons"],
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๐ข ๋ํต. . . . ์ผ์ด. . .