3.9.0
webpack4
https://zlab.github.io/report.html
webpackãã«ã
ã¢ã€ã³ã³æããã±ãŒãžæå ãjsæ件æå
æå å°ãã£ã³ã¯-vendorséå»äº
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ãããã±ãŒãžã¯ç¢ºãã«2åã«ãªããŸã
ð¢é çã ã ã ãããããã ã ã
æãæ¥ããããããšã¯ãããããã®SourceMappingUrlãæã£ãŠããããšã§ã
ããŒãžã§ã³3.8.2ã«ãã©ãŒã«ããã¯ããŸãã
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demoïŒumiãããžã§ã¯ãïŒ
ããã¯ãwebpackã§resolve.alias
ã䜿çšããŠãã³ãã«ãµã€ãºãæžãããœãªã¥ãŒã·ã§ã³ã§ãã
ä»åŸãå¿
èŠãªã¢ã€ã³ã³ãã€ã³ããŒãã§ããæ°ããAPIãèšèšããäºå®ã§ãã
loading
ã close-circle
ãªã©ã 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ãã¡ã€ã«ãdllãã¡ã€ã«ã«ããããšãã§ããŸã
@ChiaJune antd
ã³ã³ããŒãã³ãã§å®å
šã«äœ¿çšãããŠããã¢ã€ã³ã³ãªã¹ããçç¥ãããå Žåã¯è¿œå ã§ããŸã
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demo/blob/master/src/icons.js#L10 -L100
fontawsomeã®ã¢ãããŒããåç §ããããšãã§ããŸã
A
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" />
B
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 />
@HeskeyBaozi @yesmeck
https://github.com/HeskeyBaozi/reduce-antd-icons-bundle-demoïŒumiãããžã§ã¯ãïŒ
ããã¯ãwebpackã§
resolve.alias
ã䜿çšããŠãã³ãã«ãµã€ãºãæžãããœãªã¥ãŒã·ã§ã³ã§ãã
ä»åŸãå¿ èŠãªã¢ã€ã³ã³ãã€ã³ããŒãã§ããæ°ããAPIãèšèšããäºå®ã§ãã
loading
ãclose-circle
ãªã©ã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
ããããã åå¥ã«ã€ã³ããŒãããŠããã¹ãŠã®äœ¿çšã·ããªãªãç¶²çŸ ãããããã§ã¯ãªããããããªãŒã·ã§ã€ã¯ãä¿®æ£ããå¿ èŠããããŸãã ãã¡ããã確èª
@serayuzgur
ç§ã¯webpack.aliasã䜿çšããŠããŸãããããã§ããŸããããŸãã å€åããã¯ããªããå©ããããšãã§ããŸã:)
ç§ã®ã¬ãã®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ãªã©ã®Webpack3ã©ã€ãã©ãªã䜿çšããŸã
ãã®ã³ã¡ã³ãã«åºã¥ããŠ
$ 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ã¯ãããžã§ã¯ãã¢ã€ã³ã³ã·ã¹ãã ãããã€ããŒã§ãã
ããã¯ãæåºãããcreate-react-appãã³ãã«åæã®æ¯èŒã§ãã
webpackã®åºå
ãã³ãã«åæ
éåæããŒãã®å ¬åŒãœãªã¥ãŒã·ã§ã³ãæäŸãããåã«ã@ ant-design / icons / lib / dist.jsãã¡ã€ã«ãdllãã¡ã€ã«ã«ããããšãã§ããŸã
@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ã䜿çšããŠããå Žåã¯ã次ã®ããšãã§ããŸãã
ããã¯åœ¹ã«ç«ã¡ãŸãããããããšãã ãããžã§ã¯ããåãåºããã®ã§ãã«ãŒããã©ã«ããŒã§ã¯ãªãwebpackãã¡ã€ã«ãé
眮ãããŠããconfigãã©ã«ããŒã__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ã䜿çšããŠããå Žåã¯ã次ã®ããšãã§ããŸããããã¯åœ¹ã«ç«ã¡ãŸãããããããšãã ãããžã§ã¯ããåãåºããã®ã§ãã«ãŒããã©ã«ããŒã§ã¯ãªãwebpackãã¡ã€ã«ãé 眮ãããŠããconfigãã©ã«ããŒã
__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ã¹ãã©ã€ããããŒãããŸãã
ã¢ã€ã³ã³ãæååãšããŠåç §ãã代ããã«ã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
ãã€ã³ããŒãããŠããŸãã ãããã®ã³ã³ããŒãã³ãããã¢ã€ã³ã³ã©ã€ãã©ãªå
šäœã§ã¯ãªããå¿
èŠãªã¢ã€ã³ã³ã®ã¿ãã€ã³ããŒãã§ãããšäŸ¿å©ã§ãã
ãã³ãã«ãµã€ãºã®åé¡ã解決ããããã«ã次ã®ãªãªãŒã¹ã§è¡ãå€æŽã¯æ¬¡ã®ãšããã§ãã
@yesmeck
3.11.x
ã§ããïŒ 3.10.4
å«ãŸããŠããªãããã§ãã
@ johnernaut ïŒ12888
ãšããããv3.8.4ã«æ»ããšã3.9.0以éã®ããŒãžã§ã³ã¯ããã±ãŒãžåãããåŸã¯å€§ããããŸããäžèšã®ç¥ã ãèšåããããŒãžã§ã³ã¯äžæçãªè§£æ±ºçã«ãããŸãããã¢ã€ã³ã³ãéåæã§ããŒããã次ã®ããŒãžã§ã³ã楜ãã¿ã«ããŠããŸãã
@yesmeckã«æè¬ã
ãŸãã create-react-app
v2ããã³craco
çšã®AntDesignãã©ã°ã€ã³ãå
¬éããããšã«ãèšåããããšæããŸãã ãããGitHubã®craco-antdãã©ã°ã€ã³ã§ã
Ant Design Iconsã»ã¯ã·ã§ã³ããLargeBundle SizeãREADMEã«è¿œå ããŸããããã®åé¡ïŒããã³PR ïŒã«æ³šç®ããŸãã
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
ããªãå Žåã¯ãæåŸ
ã©ããã«æ©èœããŸãã
ããã¯ãwebpackããã©ããåãããesã¢ãžã¥ãŒã«ã§ããªãŒã·ã§ã€ã¯ãè¡ããªãããšã«é¢ããããã€ãã®æŽå²çèæ¯ã§ãã 圌ããèšåããŠããããšã¯ã DllPlugin
ããã€ãã®ãšããžã±ãŒã¹ãé€ããŠãæè¿ã®ãªãªãŒã¹ã§ã»ãšãã©ä¿®æ£ãããŠãããšæããŸãã
èå³æ·±ãããšã«ãwebpackãDllPluginã§ã®ããªãŒã·ã§ã€ã¯ããµããŒãããã®ã¯ã5æã«ãªã£ãŠentryOnly: true
ãè¿œå ããŸããããéããããŸããã ãã£ãšå€ç«ããäŸããã©ããããŠãwebpackã«åé¡ãæèµ·ããŸãã
ç·šéïŒè€è£œãªããžããªãšæŽå²çãªåé¡ãè¿œå ããŸããã
話ã®çµããïŒè€è£œãªããžããªãåœé ããã®ã¯ããã§ãã webpack 3.5.6ã¯ã entryOnly: true
ãµããŒãããªããšå€ãããŸãã ãã®ããã fesm5
ã¢ãžã¥ãŒã«ã¯ããªãŒã·ã§ã€ã¯ãããŸããã
ng-zorro-antd
ãdllãã³ããŒã«ãã³ãã«ããã人ã®ããã«
DllPlugin
æ§æã«entryOnly: true
ãè¿œå ããŸãã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
ãã«ã¹ã¿ã ã³ã³ããŒãã³ãã«çœ®ãæããŠããŸãã
ãã®ã³ã³ããŒãã³ãã¯ãæå®ãããAPIã«props.type
ãšprops.theme
ã®<Icon />
ãéä¿¡ããŸãã
ããã«ãããããŒãžãã¹ãäžã«äœ¿çšããããã¹ãŠã®ã¢ã€ã³ã³ããŒã¿ãèšé²ã§ããŸãã
次ã«ãããŒã¿ãšhttps://github.com/ant-design/ant-design/issues/12011#issuecomment-423173228ã«åºã¥ããŠã icons.js
èªåçã«çæããŸãã
ããè¯ã解決çãèŠã€ããããšãé¡ã£ãŠããŸãã
3ãæãçµéããŸããããåœå±ã¯ãªã³ããã³ãã§ããŒãããæ¹æ³ãèŠã€ããŸãããïŒ
å°å ¥æ¹æ³ããå§ããã®ãäžçªãããšæããŸãããçŽ æã®ããã«ãã¹ãŠã®æ§æèŠçŽ ãå¥ã ã«åŒçšããã®ãããã§ããã ãããã§ãçµã¿èŸŒã¿ã®ã¢ã€ã³ã³ã䜿çšã§ããã³ã³ããŒãã³ãã®ã¿ãããã±ãŒãžåãããŸããã ã
Icon
ã³ã³ããŒãã³ãã䜿çšãããŠããªãå Žåã@ ant-desigin / iconsããã±ãŒãžãããŒããããŸã
Icon
ã³ã³ããŒãã³ãã䜿çšãããŠããªãå Žåã@ ant-desigin / iconsããã±ãŒãžãããŒããããŸã
Datepickerã䜿çšãããŸããã³ãŒãã«ãã®ãããªãã®ããããã©ããã確èªããŠãã ããã ã¡ãã¥ãŒã䜿çšãããŸã
500KBãè¶ ãããšå€§ããããŸã
楜ãã¿ã«ããŠããã®ã§ãããããšããšææ°ããŒãžã§ã³ã«åãæ¿ããŠããã®ã§ãããããã±ãŒãžããšãŠã倧ããã®ãèŠãŠããŸãæ»ãã®ãæãã£ãã§ãã
SVG圢åŒã䜿çšããããªãã®ã§ãããæè»ã«æ§æã§ããŸããïŒ svgã䜿çšãããã©ãããæ§æãã
åäžã®ã¢ã€ã³ã³ã®ã¿ãåç §ããæ¹æ³ãæäŸã§ããantdã®ãã¹ãŠã®å éšã³ã³ããŒãã³ãã¯ãã®æ¹æ³ã䜿çšããããã«æŽæ°ãããŸãã
import Search from 'antd/icons/Search";
<Search />
æ¢åã®ãããžã§ã¯ããšã®äºææ§ã®ããã«ã import { Icon } from 'antd';
åŒãç¶ãäºçŽãããŠããŸããã import { Icon } from 'antd';
ã䜿çšãããŠããéããã¢ã€ã³ã³ã®å
šéãã€ã³ããŒããããŸãã
2éã§åæãã
å®ç§ãªè§£æ±ºçãåŸ ã£ãŠããããŒã¯
500kã¢ã€ã³ã³ã解決çã¯ãããŸããïŒ
誰ããããã«ã€ããŠè±èªã§ç§ãæŽæ°ã§ããŸããïŒ 500kbã¯ç§ã®ãã³ãã«ã®4åã®1ã§ãã ç§ã¯webpackã䜿çšããŠããã次ã®ããã«ã¢ã€ã³ã³ãã€ã³ããŒãããŠããŸãã
import Icon from 'antd/lib/icon';
<Icon type="logout" />
ç§ã¯ããããã€ã³ããŒãããããŸããŸãªæ¹æ³ãè©Šããã¢ã€ã³ã³ã®ã€ã³ããŒãããã¹ãŠåé€ããããšããè©Šã¿ãŸããããç§ãäœãããŠã500kbãæ®ã£ãŠããããã§ãã ç§ã¯webpackã䜿çšããŠãããåºç»ã®å®éšã¹ã³ãŒãã®å·»ãäžãæ©èœã䜿çšããŠã¢ã€ã³ã³ãé©åã«ããªãŒã·ã§ã€ã¯ããããšãã§ããŸããããä»ã®20ãæã§ã¢ããªãç Žæãããã䜿çšã§ããŸããã
人ã ã¯ãã®åé¡ãã©ã®ããã«æ±ã£ãŠããŸããïŒ ããã«ããå šå¡ã500kbãè¿œå ããŠãããžã§ã¯ããåºè·ããŠããã ãã§ããããããšãç§ãç¡èŠããŠããæãããªåé¿çã§ããïŒ
ãã®ããã«ã€ã³ããŒããããšãæšæºã®Webpackãã«ãã§æ©èœããŸããïŒ
import Star from 'antd/icons/star';
誰ããç§ãæŽæ°ããããšãã§ããã°ãç§ã¯ãããæ¬åœã«æè¬ããŸãã
@ApolloGunåé¿çã¯ãã®ã¹ã¬ããã§æ°ååç §ãããŠããããã¹ãŠããã®ã³ã¡ã³ãã«ãããŸãïŒ https ïŒ
ãããæ©èœããæ¹æ³ã¯ãWebpackã«å¥ã®å Žæããã¢ã€ã³ã³ã解決ããããã«æ瀺ããããšã§ããå ·äœçã«ã¯ã䜿çšãããã¢ã€ã³ã³ãæ£ç¢ºã«ãšã¯ã¹ããŒãããæ°ãããã¡ã€ã«ã§ãã ãããè¡ã£ãåŸãã¢ã€ã³ã³ã¯éåžžã©ããæ©èœããã³ã³ããŒãã³ããå€æŽããå¿ èŠã¯ãããŸããã
ç§ã¯ã¢ã€ã³ã³ã䜿çšããŠããŸããããããã§ããã®å·šå€§ãªãã¡ã€ã«ãååŸããŸãã ãã¶ããantdã®ã³ã³ããŒãã³ãã¯ãããå éšã§äœ¿çšããŠããŸãã ã³ã³ããŒãã³ãã§äœ¿çšãããŠããã¢ã€ã³ã³ã確èªããã«ã¯ã©ãããã°ããã§ããã ããã¯ãéžæãããããããŠã³ãªã©ã®ã«ã¹ã¿ã ã¢ã€ã³ã³ã§Antdã¢ã€ã³ã³ã眮ãæããããã®è¯ãæ¹æ³ã®ããã§ãã
ç§ã¯ã¢ã€ã³ã³ã䜿çšããŠããŸããããããã§ããã®å·šå€§ãªãã¡ã€ã«ãååŸããŸãã ãã¶ããantdã®ã³ã³ããŒãã³ãã¯ãããå éšã§äœ¿çšããŠããŸãã ã³ã³ããŒãã³ãã§äœ¿çšãããŠããã¢ã€ã³ã³ã確èªããã«ã¯ã©ãããã°ããã§ããã ããã¯ãéžæãããããããŠã³ãªã©ã®ã«ã¹ã¿ã ã¢ã€ã³ã³ã§Antdã¢ã€ã³ã³ã眮ãæããããã®è¯ãæ¹æ³ã®ããã§ãã
@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
ãã€ã³ãããå¿
èŠã«ãªããŸã§ãã¹ãŠã®ã¢ã€ã³ã³ã§æäœãå®è¡ããªãããšãæ€èšããŠãã ããã ãŸãããã®è¡ã®å±¥æŽã確èªããŠãã ããïŒ //github.com/ant-design/ant-design/blob/master/components/icon/index.tsx#L3æéã®çµéãšãšãã«å°ãå€åããŠããŸãã
ããã«ããããããžã§ã¯ãå šäœãçŽæ¥å©çšã§ããªããªããŸã
@poorel ã
<Icon />
ã¯ãããã©ã«ãã§ã¢ã€ã³ã³ã©ã€ãã©ãªãå®å šã«å°å ¥ããŸããã©ã³ã¿ã€ã ã«ã©ã®ãããªã¢ã€ã³ã³ãå°å ¥ãããããããªãããã§ãã以åã¯ãã¢ã€ã³ã³ã¯iconfont.cn
ãã¹ããããŠãããããããã±ãŒãžã³ã°ã®èªèã¯ãããŸãããããã«ã¯ãäžæçãªèšç»ã«ã€ããŠã®è©³çŽ°ãªè°è«ãå¿ èŠã§ãã ïŒ12011ïŒã³ã¡ã³ãïŒãåç §ããŠãã ããã
ãã®ãœãªã¥ãŒã·ã§ã³ã¯åŒãç¶ã䜿çšã§ããŸãããã¹ãããŸãããããããžã§ã¯ãã«å«ãŸããã¢ã€ã³ã³ãæŽçããå¿ èŠããããŸããããã¯ããå°ãé¢åã§ãã
ãã ãããããžã§ã¯ãã«å«ãŸããã¢ã€ã³ã³ãæŽçããå¿ èŠããããŸã...
以åèªãã§ã¿ããšãããã¢ã€ã³ã³ã®åç §ã®å€ãã¯antdç¬èªã®ã³ã³ããŒãã³ãã§äœæãããŠããããã®æ°ã¯å°ãªããããŸãããããžãã¹ã§çŽæ¥åŒçšãããã®ã¯éåžžã«å°ãªãã§ãããã³ã³ããŒãã³ããåç §ãããŠããå¯èœæ§ãããããšãèãããšãæ°ãæ°ããã®ã¯ç°¡åã§ã¯ãããŸããã
@chenyongãããšããã®åµãçãã ã ã
@aryzingããªãã®ã¢ãããŒãã¯é åçã«èãããŸãã ïŒ12888ãããåŽåãå°ãªããªããŸããïŒ ãã®PRã«ã¯ãããŸãã«ãå€ãã®é倧ãªå€æŽãå«ãŸããŠããŸããããããããããæ°ãæçµã£ãŠããŸã å®äºããŠããªãçç±ã®1ã€ã§ãã
@ zachguo ïŒ
äžéšã®antdã³ã³ããŒãã³ãã§äœ¿çšãããã¢ã€ã³ã³ã¯ãå°éå ·ã«åºã¥ããŠåçã«ã¬ã³ããªã³ã°ãããŸãïŒã€ãŸããå®è¡æã«æ±ºå®ãããŸãïŒã ããšãã°ã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ã®ããŒãå¯èœãªã³ã³ããŒãã³ãã䜿çšããŠãã ããã
Reactã®ããŒãå¯èœãªã³ã³ããŒãã³ãã䜿çšããŠãã ããã
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
ã2çªç®ã®ã¹ãããã¯ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ãã©ã«ãicons
ãäœæããã¹ã¯ãªããã䜿çšããŠ@ant-design/icons
å
ã®ãã¹ãŠã®ã¢ã€ã³ã³ããšã¯ã¹ããŒãããããšã§ãã
2çªç®ã®ã¹ãããã¯ããããžã§ã¯ãã«ãŒãã«ãã©ã«ããŒ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
ãã©ã«ããŒã«ä¿åããŸãã
3çªç®ã®ã¹ãããã¯ãAntdã³ãŒããªããžããªå
ã®components / icon / index.tsxããããžã§ã¯ãã«ãŒããã£ã¬ã¯ããªã«ã³ããŒãã Icon.jsx
ãŸãã¯Icon.js
ãšããååãä»ããŠãããã³ãŒãå
ã®TypeScriptã¿ã€ãå®çŸ©ãåé€ããŠçŽç²ã«ããããšã§ãã JavaScriptã³ãŒãã ïŒãããžã§ã¯ãã§TypeScriptã䜿çšããŠããå Žåã¯ã Icon.tsx
ãŸãã¯Icon.ts
ãšããååãçŽæ¥ä»ããããšãã§ãããããã¿ã€ãå®çŸ©ãåé€ããå¿
èŠã¯ãããŸããïŒ
3çªç®ã®ã¹ãããã§ã¯ã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 path = requireïŒ 'path'ïŒ;
+ const webpack = requireïŒ 'webpack'ïŒ;
const HtmlWebpackPlugin = requireïŒ 'html-webpack-plugin'ïŒ;
const TerserPlugin = requireïŒ 'terser-webpack-plugin'ïŒ;
@@ -33,12 +34,16 @@
ãã©ã°ã€ã³ïŒ[
æ°ããHtmlWebpackPluginïŒ{
ã¿ã€ãã«ïŒãçŽ æŽãããããŒãžãã
ãã³ãã¬ãŒãïŒpath.joinïŒ__ dirnameã 'public / index.html'ïŒã
ã¡ã¿ïŒ{
ãã¥ãŒããŒãïŒ 'width = device-widthãinitial-scale = 1'ã
}ã
ããã·ã¥ïŒtrueã
}ïŒã
ãã®ãœãªã¥ãŒã·ã§ã³ã®å©ç¹ã¯ããã¹ãŠã®ã¢ã€ã³ã³ãä¿æã§ããã¢ã€ã³ã³ã®äžè¶³ãå¿é
ããããšãªããæ§æå¯èœãªèæ¯ç®¡çã·ã¹ãã ã§ã¢ã€ã³ã³ãä»»æã«å€æŽã§ããããšã§ããã¢ã€ã³ã³ã¯ãªã³ããã³ãã§èªã¿èŸŒãŸããç¹å®ã®ããŒãžã®ã¢ã€ã³ã³ãã¬ã³ããªã³ã°ããããšãã«ã®ã¿èªã¿èŸŒãŸããŸãã察å¿ããã¢ã€ã³ã³ãã¡ã€ã«ãããŒãããå¿
èŠãããã®ã¯ãããã±ãŒãžåãããã€ã³ããã¯ã¹ã®çŽ50Kã®ã¢ã€ã³ã³ãªã¹ãããŒã¿ã ãã§ãïŒ Icon.jsx
ã®Webpackããžãã¯ã³ã¡ã³ãã§çãååãæå®ãããšããµã€ãºãå°ããã§ããŸãïŒã
ãã®ãœãªã¥ãŒã·ã§ã³ã®å©ç¹ã¯ããã¹ãŠã®ã¢ã€ã³ã³ãä¿æã§ããããšãæ¬ èœããŠããã¢ã€ã³ã³ãæ°ã«ããã«æ§æå¯èœãªããã¯ã°ã©ãŠã³ã管çã·ã¹ãã ã§ã¢ã€ã³ã³ãå€æŽã§ããããšãããã³ã¢ã€ã³ã³ããªã³ããã³ãã§ããŒããããããšã§ããã¬ã³ããªã³ã°ã«å¿
èŠãªã¢ã€ã³ã³ã®ã¿ãããŒããããŸããç¹å®ã®ããŒãžã®ã¬ã³ããªã³ã°ãéå§ãããšããããŒãããå¿
èŠã®ããããã±ãŒãžåãããã€ã³ããã¯ã¹ãã¡ã€ã«ã«ã¯ãçŽ50Kã®ã¢ã€ã³ã³ãªã¹ãããŒã¿ãããããŸããïŒ Icon.jsx
ã®Webpackããžãã¯ã³ã¡ã³ãã§çãååãæå®ãããšããã®ãµã€ãºãæžããããšãã§ããŸãïŒã
ãã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ãåã¢ã€ã³ã³ã«ã¢ã€ã³ã³ã®å
容ã«å ããŠè¿œå ã®Webpackã¢ãžã¥ãŒã«æ
å ±ãå«ãŸããŠãããããiconsãã©ã«ããŒã®ãµã€ãºããããã±ãŒãžåãããåäžãã¡ã€ã«ã®ãµã€ãºã«å ããŠãã€ã³ããã¯ã¹ã®50Kãããã¯ããã«å€§ããããšãããããŸããã¢ã€ã³ã³ãªã¹ãã®ããŒã¿ã¯ãå®éã«ã¯3Mã«è¿ããµã€ãºã§ããã¯ãããŠããŸãããã ããå®éã«ååŸã«äœ¿çšã§ããã¢ã€ã³ã³ã¯æ°åãŸãã¯æ°ååãããªãããããŠãŒã¶ãŒã®ãã©ãŠã¶ã«ãã£ãŠããŠã³ããŒããããããŒã¿ã®éã¯ããã»ã©å€ãã¯ãªãã1ã€ã®ããŒãžã«åæã«è¡šç€ºãããã¢ã€ã³ã³ã®æ°ããªãéããéåæã§èªã¿èŸŒãŸããŸããããã«ãããŒãé床ã«ã¯ã»ãšãã©åœ±é¿ããŸããã
ãã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ãåã¢ã€ã³ã³ã«ã¢ã€ã³ã³ã®å
容ã«å ããŠWebpackã¢ãžã¥ãŒã«æ
å ±ãå«ãŸããŠããããã icons
ãã©ã«ããŒã®ãµã€ãºã以åã«ããã±ãŒãžåãããåäžãã¡ã€ã«ã®ãµã€ãºãããã¯ããã«å€§ããããšã§ããã€ã³ããã¯ã¹ãã¡ã€ã«å
ã®50Kã®ã¢ã€ã³ã³ãªã¹ãããŒã¿ãå®éã®ããã±ãŒãžãµã€ãºã¯3Mã«è¿ãã§ãããã ããå®éã«äœ¿çšã§ããã¢ã€ã³ã³ã¯æ°åãŸãã¯æ°ååãããªãããããŠãŒã¶ãŒã®ãã©ãŠã¶ã«ãã£ãŠããŠã³ããŒããããããŒã¿ã®éã¯ããã»ã©å€ããããŸããã ãéåæã§èªã¿èŸŒãŸããããã1ããŒãžã«è¡šç€ºãããã¢ã€ã³ã³ã®æ°ãå€ããªãéããèªã¿èŸŒã¿é床ãžã®åœ±é¿ã¯å€§ãããããŸããã
@ jinliming2ã¯ã¯ãŒã«ãªå€æŽã§ãããwebpackã€ã³ããŒããå®éã«å€æ°ãæž¡ãããšãã§ããããšãèŠã€ããã ãã§ã
webpackã«ã¯å°ãªããšãããã€ãã®ãã¡ã€ã«ã®å Žææ å ±ãå¿ èŠãªãããimportïŒfooïŒãªã©ã®å®å šã«åçãªã¹ããŒãã¡ã³ãã¯å€±æããŸããããã¯ãfooãã·ã¹ãã ãŸãã¯ãããžã§ã¯ãå ã®ä»»æã®ãã¡ã€ã«ãžã®ãã¹ã§ããå¯èœæ§ãããããã§ããimportïŒïŒã«ã¯å°ãªããšãããã€ãã®ãã¡ã€ã«ãå«ãŸããŠããå¿ èŠããããŸããã¢ãžã¥ãŒã«ãé 眮ãããŠããå Žæã«é¢ããæ å ±ããããã£ãŠããã³ãã«ãç¹å®ã®ãã£ã¬ã¯ããªãŸãã¯ãã¡ã€ã«ã®ã»ããã«å¶éã§ããŸãã
å®éã«ã¯ããã£ã¬ã¯ããªã®ãã¬ãã£ãã¯ã¹ãããéãã以åã¯åãå
¥ããããŸããã§ããã
ããã¯èšã£ãŠããantdãŠãŒã¶ãŒã¯webpackã䜿çšããã ãã§ãªããå°ãæ¥ããããããšã§ãã
@aryzingææ¡ãããAPIã®ãªãã·ã§ã³1ã¯ãå®éã«ã¯ïŒ12888ãéæããããšããŠãããã®ã®ããã§ãã å€ãã®é倧ãªå€æŽãå«ãŸãããããããããAntDesignããŒã ããããå®äºããã®ãåŸ ã€å¿ èŠããããŸãã
xhrã䜿çšããŠsvgãéåæã«ããŒãããããšãæ€èšã§ããŸããïŒ
ã¢ãŒãã£ãŒ-svgs
ant deisgn
èªäœãããå€ãã®ã¢ã€ã³ã³ã䜿çšããããã åŸæ æ件
ãéåæããŒãã¹ããŒã ã«å€æŽããŠãã¡ã€ã³ãã¡ã€ã«ããªã¥ãŒã ãå æããªãããã«ããããšãæ€èšããŠãã ããããããåç
§ã§ããŸãã
ant deisgnèªäœã¯ããå€ãã®ã¢ã€ã³ã³ã䜿çšãããããã¢ã€ã³ã³ãã¡ã€ã«ãéåæããŒãã¹ããŒã ã«å€æŽããŠãã¡ã€ã³ãã¡ã€ã«ãµã€ãºãå æããå¿ èŠããªãããã«ããããšãæ€èšããŠãã ããããããåç §ã§ããŸãã
@rororofffã¯ãã®åé¡ã«$ 2.00ã®è³éãæäŸããŸããã
ãã®äŒè©±ã®é·ãã«æ¯ããŠããŠãcreate-react-appãšant-designã䜿ãããã ãã®äººã®ããã«ãç§ã¯ããã§å®åãããžã§ã¯ããäœæããŸããhttps://github.com/AustinGreen/cra-antd-starter
ããã«ã¯ãã¢ã€ã³ã³ãã³ãã«ãµã€ãºã®åé¡ã®ä¿®æ£ãšãã€ãžã§ã¯ããªãã®ã«ã¹ã¿ã Webpackæ§æãå«ãŸããŸãã @ ndbroadbent ã @ patricklafrance ããããŠant-designããŒã å šäœã®æžåœãªåªåã«æè¬ããŸãã
ãã®äŒè©±ã®é·ãã«æ¯ããŠããŠãcreate-react-appãšant-designã䜿ãããã ãã®äººã®ããã«ãç§ã¯ããã§å®åãããžã§ã¯ããäœæããŸããhttps://github.com/AustinGreen/cra-antd-starter
ããã«ã¯ãã¢ã€ã³ã³ãã³ãã«ãµã€ãºã®åé¡ã®ä¿®æ£ãšãã€ãžã§ã¯ããªãã®ã«ã¹ã¿ã Webpackæ§æãå«ãŸããŸãã @ ndbroadbent ã @ patricklafrance ããããŠant-designããŒã å šäœã®æžåœãªåªåã«æè¬ããŸãã
Nextjsã¢ããªã§ã©ã®ããã«äœ¿çšã§ããŸããïŒ
@AustinGreenç§ã¯ããªãã®äŸãè©ŠããŸããã
ãµã€ãããŒãšãã¿ã³ã1ã€ããããµã€ãºãçŽ100kBã®ã¢ããªã®å ŽåãGzipå§çž®ã¯ãŸã å€ãããŸãã
@anjmaoãã³ãã«ãµã€ãºãããã«çž®å°ããæ¹æ³ãããå Žåã¯ããç¥ãããã ãããè¿œå ããŸãããšã³ã¿ãŒãã©ã€ãºWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããå Žåã¯ãããã³ããšã³ããã¬ãŒã ã¯ãŒã¯çšã«æ倧100kB Gzipã§å§çž®ãããæ倧5ã€ã®ã³ã³ããŒãã³ãïŒå æ¬çãªã³ã³ããŒãã³ãã©ã€ãã©ãªïŒãã¢ã€ã³ã³ãããã³ãã®ä»ã®ãŠãŒãã£ãªãã£ã¯ããªãæšæºçã§ãã
@anjmaoãã³ãã«ãµã€ãºãããã«çž®å°ããæ¹æ³ãããå Žåã¯ããç¥ãããã ãããè¿œå ããŸãããšã³ã¿ãŒãã©ã€ãºWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããå Žåã¯ãããã³ããšã³ããã¬ãŒã ã¯ãŒã¯çšã«æ倧100kB Gzipã§å§çž®ãããæ倧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.
åèãŸã§ã«ãwebpackãšã€ãªã¢ã¹ã䜿çšããŠãã³ãã«ãµã€ãºãçž®å°ãã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.21Mbãç¯çŽããŠããŸã
ãã¢ãããžã§ã¯ããšåãçµãã§ãããããžã§ã¯ãã®äž¡æ¹ããçŽ æŽããã
åæ¥çã«ã
ä»ã®èª°ããåããã®ãæã£ãŠããå Žåã«åããŠãããã«ãµã³ãã«ãããžã§ã¯ããæçš¿ããŠããŸã
åé¡ïŒ
https://github.com/vladimirmoushkov/ant-icons-webpack-loade-test/#readme
webpack-ant-icon-loaderããªããšã次ã®çµæãåŸãããŸãã
bundle.development.js 4.59MiBã¢ããª[æŸåº]ã¢ããª
webpack-ant-icon-loaderã䜿çšãããšã次ã®ããã«ãªããŸãã
../../index.html555ãã€ã[æŸåº]
0.bundle.development.js 1.21 MiB 0 [æŸåº]
bundle.development.js 3.41MiBã¢ããª[æŸåº]ã¢ããª
泚æäºé ã®ã«ããã«ïŒ
éã2019幎4æ5æ¥ã«ã¯2æ38åPMã«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
ã
ããªãã®ãœãªã¥ãŒã·ã§ã³ç°ãªãããAntãææžåãããã©ã®ããã«ãåã«å¥œå¥å¿@AustinGreen react-app-rewired
ãšbabel-plugin-import
ããã§èª¬æããæ¹æ³- https://ant.design/docs/react/use-with-create-react -ã¢ããªïŒ
GitHubcreatereactã¢ããªãšantãã¶ã€ã³ã䜿çšããããã®ãã€ã©ãŒãã¬ãŒã-AustinGreen / cra-antd-starter
ãšã³ã¿ãŒãã©ã€ãºã¯ã©ã¹ã®UIãã¶ã€ã³èšèªãšReactããŒã¹ã®å®è£ ãšé«å質ã®Reactã³ã³ããŒãã³ãã®ã»ãããäŒæ¥åãã®æé«ã®ReactUIã©ã€ãã©ãªã®1ã€
@annjawn create-react-app 2.0以éãreact-app-rewiredã¯ç¶æãããªããªã£ããããç§ã®ãããžã§ã¯ãã§ã¯ãCRA2.0ã®react-app-rewiredã眮ãæããããã«äœæãããcraco + craco-antdã䜿çšããŠããŸãã
@ Beven91ç§ã®åã®ã³ã¡ã³ãã®ãã®éšåãæäŒã£ãŠãããŸãããã
- ã¢ã€ã³ã³ã¯æçµè£œåããæ¶ããŸããã€ãŸããããŒãžã«è¡šç€ºãããŸããã umirc.jsã®èšå®ãèŠãŸããããreact-routerã䜿çšããŠããŸãã ã©ãããã°ããããå衚瀺ãããããšãã§ããŸããïŒ
ãã³ãã«å šäœã§ã¢ã€ã³ã³ãåé¢ãããŠããã®ã¯çŽ æŽãããããšã§ããã䜿çšãããŠããã¢ã€ã³ã³ã¯åé¢ããããã³ãã«ã®äžéšã®ãŸãŸãªã®ã§ããããã䜿çšãããšãåé¢ãç¡æå³ã«ãªãå¥åã®ãã³ãã«ãšããŠå«ãŸããããšã«ãªããŸãã
@annjawn create-react-app 2.0以éãreact-app-rewiredã¯ç¶æãããªããªã£ããããç§ã®ãããžã§ã¯ãã§ã¯ãCRA2.0ã®react-app-rewiredã眮ãæããããã«äœæãããcraco + craco-antdã䜿çšããŠããŸãã
@AustinGreenã¯çã«ããªã£ãŠããŸããã
@vladimirmoushkov
é
ããŠãã¿ãŸãããç§ã¯ããã解決ããããšããŸãã
ããã«ã¡ã¯@vladimirmoushkov
詳现ã¯ãã¡ããã芧ãã ããã ant-icons-webpack-loade-testïŒ1
ä¿®æ£ããããŸã§ç§ã®ããã«åããäžæçãªè§£æ±ºçïŒantd> = 3.9ïŒ
- ã¢ã€ã³ã³ãç°ãªãæ¹æ³ã§è§£æ±ºããããã«webpackãé©å¿ãããŸãã Webpackæ§æã§ïŒ
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ã®å€æŽïŒã§ãããè¡ãããšãå¯èœã§ã
ããã¯ãã¢ã€ã³ã³ã䜿çšããAntã³ã³ããŒãã³ãã§ã¯æ©èœããŸããã ããšãã°ãã¢ã©ãŒãã³ã³ããŒãã³ãã¯ãã§ãã¯ã¢ã€ã³ã³ãšéããã¢ã€ã³ã³ã䜿çšããŸããããã®ãœãªã¥ãŒã·ã§ã³ã§ã¯è¡šç€ºãããŸãã
@ Venugopal46ãããã®ã¢ã€ã³ã³ïŒantã³ã³ããŒãã³ãã§äœ¿çšãããïŒãicons.js
è¿œå ããããšãã§ããŸãã
ç§ã«ãšã£ãŠã¯ããŸããããŸãã
解決çã«è¿ã¥ããŠããããã§ãã æåŸã«ããã«ãããã»ã¹ã®äžéšãšããŠicons.jsãèªåçæãããŠãŒãã£ãªãã£ãäœæã§ããŸãã
ã©ã®ã¢ã€ã³ã³ãantã®ç¬èªã®ã³ã³ããŒãã³ããä»ããŠã€ã³ããŒããããŠããããæ£ç¢ºã«ææ¡ããŠãããããicons.js
ã«é
眮ããã«ã¯ã©ãããã°ããã§ããïŒ
ç§ã«ãšã£ãŠäžèšã®ããã¯ïŒ
- ã¢ã€ã³ã³ãç°ãªãæ¹æ³ã§è§£æ±ºããããã«webpackãé©å¿ãããŸãã Webpackæ§æã§ïŒ
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å°ãªããªããŸãã
ã©ã®ã¢ã€ã³ã³ãantã®ç¬èªã®ã³ã³ããŒãã³ããä»ããŠã€ã³ããŒããããŠããããæ£ç¢ºã«ææ¡ããŠããããã
icons.js
ã«é 眮ããã«ã¯ã©ãããã°ããã§ããïŒ
WebããŒãžã«ãªãïŒè¡šç€ºãããŠããªãïŒã¢ã€ã³ã³ãè¿œå ããŠããã ãã§ãããããã«ããã¯ãã§ãã 䜿çšããŠããantdã®ã³ã³ããŒãã³ãã®éã«ãã£ãŠç°ãªããŸãããç§ã«ãšã£ãŠã¯ãè¿œå ããã®ã«çŽ10åããããŸããã ïŒç§ã¯å€ãã®antdã³ã³ããŒãã³ãã䜿çšããŠããŸããïŒ
ããšãã°ãããŒãã«ã®ãœãŒã¿ãŒç¢å°ãæ¬ èœããŠããå ŽåïŒ
<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';
æåã®ã¢ãããŒãã§ã¯ãããŸããããæåŸ ã©ããã«æ©èœããŸãã ãã®ãããªæ±ããããã³ã°ãåé¿ã§ããããã«ãå°æ¥ã®ãªãªãŒã¹ã§ãããä¿®æ£ããantéçºããŒã ã楜ãã¿ã«ããŠããŸãã
ããã«ã¡ã¯ ïŒ
ãã®ããŒãã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ æ¬¡ã®antdã®ãªãªãŒã¹ã®åè£ã§ããïŒ
ãã®åé¡ã解決ããããã«ããã€ãã®ããšãè©Šã¿ãŸãããïŒ webpack-ant-icon-loader
ã babel-import-plugin
ïŒãã©ããæ©èœããŸããã§ããã
ããããšãïŒ
æ¬åœã«ããã«å¯Ÿãã解決çãå¿ èŠã§ãããã³ãã«ãµã€ãºã倧ããããŸãïŒ
@zlab @nuintun @anjmaoãã«ããå¿ èŠãªå Žåã¯ã httpsïŒ //zlab.github.io/report.htmlã«åãåãããŠãã ããããã®ããŒãžãçæãããã©ã°ã€ã³ã¯äœã§ãããèªåã®ãããžã§ã¯ããåæããã
ç§ã¯ãããèŠã€ããŸãããããã¯webpack-bundle-analyzerã§ã
ã¢ãŒãã«ã®ã¿ã䜿çšãããŸããã500kã¢ã€ã³ã³ã©ã€ãã©ãªãããã±ãŒãžåãããŠããŸã
å幎以äžçµã¡ãŸããããé²å±ã¯ãããŸãããïŒ
antdãæŸæ£ããŠããã®ãããªéèŠãªåé¡ã¯éèŠãšããŒã¯ãããŠããŸãã...
ãªã³ããã³ãã§ã¢ã€ã³ã³ã«ããã±ãŒãžåããå¿ èŠã®ãããã¡ã€ã«ãããŒãããŸãã500kb
Webpackã«ãšã€ãªã¢ã¹ãè¿œå ãã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. webpackexternalsã®äœ¿çš= {'antd'ïŒ 'antd'}ã¯ããŸãæ©èœããŸãããããã±ãŒãžåæäžã«antdã衚瀺ãããŸããïŒ
1.ã¢ã€ã³ã³ã¢ã€ã³ã³ã¯ãããžã§ã¯ãã§äœ¿çšãããŠããŸããããããã±ãŒãžãããã®ã¯ãªãã§ããïŒå©ããŠãã ããã
2. webpackexternalsã®äœ¿çš= {'antd'ïŒ 'antd'}ã¯ããŸãæ©èœããŸãããããã±ãŒãžåæäžã«antdã衚瀺ãããŸããïŒ
@wiiler
ãããåç §ããŠãã ãããããã¯ã¢ã€ã³ã³ãåç §ããã³ã³ããŒãã³ãã§ããå¯èœæ§ããããŸã
https://github.com/ant-design/ant-design/issues/12011#issuecomment -418003883
å®éã<DatePicker />
ã<Select />
ãªã©ã<Icon />
ã䜿çšããçµã¿èŸŒã¿ã³ã³ããŒãã³ãã¯ã䜿çšæã«å®å šã«å°å ¥ãããŸãã
å€éšã䜿çšããå Žåã¯ãbabel-plugin-importãã©ã°ã€ã³ããªãã«ããå¿ èŠããããŸã
Webpackã«ãšã€ãªã¢ã¹ãè¿œå ãã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'), }), ], },
ãããã®2ã€ã®æ¹æ³ããå§ãããŸã
@ As3ass1n
'../src/utils/antdIcon.ts'ã« '..'ãããã®ã¯ãªãã§ããïŒ webpackæ§æã¯å¥ã®ãã£ã¬ã¯ããªã«é
眮ãããŠããŸããïŒ
1.ã¢ã€ã³ã³ã¢ã€ã³ã³ã¯ãããžã§ã¯ãã§äœ¿çšãããŠããŸããããããã±ãŒãžãããã®ã¯ãªãã§ããïŒå©ããŠãã ããã
2. webpackexternalsã®äœ¿çš= {'antd'ïŒ 'antd'}ã¯ããŸãæ©èœããŸãããããã±ãŒãžåæäžã«antdã衚瀺ãããŸããïŒ@wiiler
- ãããåç §ããŠãã ãããããã¯ã¢ã€ã³ã³ãåç §ããã³ã³ããŒãã³ãã§ããå¯èœæ§ããããŸã
> ïŒ12011ïŒã³ã¡ã³ãïŒ
>å®éã<DatePicker />
ã<Select />
ãªã©ã<Icon />
ã䜿çšããçµã¿èŸŒã¿ã³ã³ããŒãã³ãã¯ã䜿çšæã«å®å šã«å°å ¥ãããŸãã- å€éšã䜿çšããå Žåã¯ãbabel-plugin-importãã©ã°ã€ã³ããªãã«ããå¿ èŠããããŸã
äºè§£ããŸãããããããšã
Webpackã«ãšã€ãªã¢ã¹ãè¿œå ãã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'), }), ], },
ãããã®2ã€ã®æ¹æ³ããå§ãããŸã
@ As3ass1n
'../src/utils/antdIcon.ts'ã« '..'ãããã®ã¯ãªãã§ããïŒ webpackæ§æã¯å¥ã®ãã£ã¬ã¯ããªã«é 眮ãããŠããŸããïŒ
ãã¿ãŸãããããã¯ç§ã®ããã§ãã ééã£ããã¡ã€ã«åãæžã蟌ãã ã®ã§ããããšã€ãªã¢ã¹ã䜿çšããŠè§£æ±ºããŸããã ããããšã
ãã®åé¡ã¯å°æ¥è§£æ±ºãããªãã®ã§ããããïŒ 400kè¿ãå¢å
ããã«ã¡ã¯ãããããã€è§£æ±ºããããã«ã€ããŠå°ãªããšã倧ãŸããªæéã®èŠç©ãããæäŸããããšã¯å¯èœã§ããïŒ
ãã³ãã«ã«490kbãè¿œå ãããšã Icon
å®è³ªçã«äœ¿çšã§ããªããªããŸãã ããã¯ããªã倧ããªåé¡ã§ãããããã«å¯Ÿããä¿®æ£ããªãªãŒã¹ãããŸã§ã«å®è¡ã§ããäžæçãªä¿®æ£ã¯ãããŸããïŒ
@smddzcyã¯ã¹ã¬ãããèªã¿ãŸãããïŒ
@ schester44ããŸããŸãªèšèªã§æžãããã¹ã¬ããã§âŠã¢ã«ãã¡ãããããããã¯é³ç¯æåãèšããšããã ã£ãããã¹ã¯ãªãããŸã§è¡ããªããã°ãªããªããšæãâŠèšèªåŠãéåžžèšèªã«éå®ãããŠãã人ã«ãšã£ãŠã¯ããªãé£ãããšæãäœãèµ·ãã£ãŠããã®ããå®å šã«æ確ã«ããããã«ããšãã«ãªã¢èªãã掟çããã¢ã«ãã¡ãããã«å¶éãããŠããŸãã
ããã«ã¡ã¯çãããç§ã¯éåžžã«åçŽãªpurched-antd-iconsããã±ãŒãžã®å®è£ ã§æåããŸããããããã¯å®å šã«æåã§ãã DOMã調ã¹ãŠãæ¬ èœããŠããã¢ã€ã³ã³ã調æŽããããã«3ã4æéããããåããŠãããšæšå®ããŸãã ããã¯ãéçº/ãªãªãŒã¹ãµã€ã¯ã«ã®æåŸã®æ®µéã§å®è£ ããäºå®ã§ãã ããã±ãŒãžåããã/ãªãã©ã€ã³ãã¡ãŒã¹ãã®ã¢ããªã±ãŒã·ã§ã³ã®å Žåãå¯äžã®åé¡ã¯ãéåžžã«æ§ãããªiOS WKWebviewRAMã®å¶éã«è¿ã¥ãããšã§ãã ç§ãã¡ã«ãšã£ãŠã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 />
@HeskeyBaozi @yesmeck
V4ããŒããããã«ãããšãããã¯ä»å¹Žã®ç¬¬4ååæã«ä¿®æ£ãããäºå®ã§ãã
ãã£ãããïŒã¹ãã€ãªãŒïŒ
VAOã®Th 7ã6 THG 1ã2019 VAO LUC 1æ51åã¶ãã¯é[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=ADKDE4RXC63VER4GSUMG5Q3PYFXT7A5CNFSM4FS3WEAKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ADKDE4TGAYRMSJQB246RQ33PYFXT7ANCNFSM4FS3WEAA
ã
ICYMIãã¢ã€ã³ã³ã®ããã¥ã¡ã³ãã¯ããã«èšåããŸããã 以äžã«ãã®ã³ããŒã
"â ïž3.9.0ã§ã€ã³ããŒããããã¹ãŠã®SVGã¢ã€ã³ã³ã«ãã£ãŠããããããè¿œå ã®ãã³ãã«ãµã€ãºã«ã€ããŠãéçºè
ãå¿
èŠã«å¿ããŠã¢ã€ã³ã³ãã€ã³ããŒãã§ããããã«ããæ°ããAPIãæäŸããŸããããã«é²ãã§ããããã«ïŒ12011ããã¬ãŒã¹ã§ããŸãã
ãã®åã«ãã³ãã¥ããã£ã®webpackãã©ã°ã€ã³ã䜿çšããŠãã¢ã€ã³ã³ãã¡ã€ã«ããã£ã³ã¯åã§ããŸããã
æåŸã®ãããã¯ã¯ãŒã«ã§ããã³ãŒããåå²ããŠã¢ã€ã³ã³ãéåæã«ããŒãããŸããç§ã®å Žåã¯ãã³ãŒããåå²ããŠã¢ã€ã³ã³ããŸã£ãã䜿çšããŸããã
åœå±ã¯ããããããããŸãããïŒããã¯ã©ããããã®æéã§ããããŸã ããã解決ããŠããŸãããïŒ
åœå±ã¯ããããããããŸãããïŒããã¯ã©ããããã®æéã§ããããŸã ããã解決ããŠããŸãããïŒ
@ zhe-he
æ確ãªè§£æ±ºçã¯ãããŸããïŒ
ãã®åœ¹äººã¯æ¬åœã«ãã®åé¡ã解決ããã€ããã¯ãªãã®ã§ããïŒãã®ãããªå€§ããªäžèŠãªããã±ãŒãžã¯æ¬åœã«å»ãããã«èª¬åŸãããŸã
@DemoHu
@tibotiberã¢ã€ã³ã³ããŒããŒãžã®ãªã³ã¯ã«æè¬ããŸãããã¢ã€ã³ã³ãã£ã³ã¯ã¯ãŸã 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-
./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.
@marcosfedeããïŒ ç§ã®æªãã åãããŸããã
ã¢ã€ãã¢ããããŸãð¡ @ 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å€æãšåãã§ãããbabelãšã¹ã±ãŒãã䜿çšãããšæããã«ã¯ãŒã¯ããŒãã軜æžãããåçãªå€æŽã®ã¿ãæåã§åŠçããå¿ èŠããããŸãã
æšå€ã³ã¡ã³ããæçš¿ããåŸãäžæçã«Babelãã©ã°ã€ã³ãäœæããŸãããããŒã«ã«ã§è©ŠããŸããããå®å šã«å®è¡å¯èœã§ã@ 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
antd4ã®ã¢ã«ãã¡çãä»ããè©Šãããšãã§ããŸã
https://github.com/ant-design/ant-design/releases/tag/4.0.0-alpha.2
ã¢ã€ã³ã³ãåŒãåºããŠãæšã®æºãããµããŒãããŸãã
ãã®åœ¹äººã¯æ¬åœã«ãã®åé¡ã解決ããã€ããã¯ãªãã®ã§ããïŒãã®ãããªå€§ããªäžèŠãªããã±ãŒãžã¯æ¬åœã«å»ãããã«èª¬åŸãããŸã
å®éãããã¯afc163ãã¯ãªã¹ãã¹ã«ããã®ãšåãè²èª¿ãæã£ãŠããŸãããµãããã¹ãã¯ãç§ã¯ããã奜ãã§ããããªãã¯ããã奜ãã§ããïŒãã§ãã
@ lizy0329 4.0.0-alpha.2ãå€æŽãããŸããããšãã«ã®ãŒãšæéã®èª¿æŽãå¿ èŠã§ãããæ¥ãã®å Žåã¯ããã©ãŒã¯ã§èªåã§å€æŽããŠãã ãã...
@ lizy0329https ïŒ //github.com/ant-design/ant-design/pull/18217ãåç §ããŠãã ãã
ãã£ããããæ¬åœã«ã
@ lizy0329 ïŒ
ãã£ããããæ¬åœã«ã
æ¬åœã«ãã£ããããããªãããããããããå€ãããšããã®çµæãæ³åããå¿ èŠããããŸããHOïŒHOïŒãšåãè²èª¿ã¯ãæ¯èŒããã«æ¯èŒããããšã¯ã§ããŸããã
@ lizy0329
ä»äžè¥¿è·afc163åšå£è¯èçæäœææ¯äžççè°æ§ãæœå°è¯æ¯ãèåå欢ãäœ ç±çšäžçšã
ãã©ã³ãã®ä»£ããã«SVGã䜿çšããã®ã¯ãªãã§ããïŒ
ã¢ã€ã³ã³ãã©ã³ãã®ä»£ããã«ReactSVGã³ã³ããŒãã³ããã¢ã€ã³ã³ã«äœ¿çšãã
äŒç€Ÿã¯ä»¥åã«ãããè¡ã£ãããšããããŸããïŒ
SVGã§ãªã¯ãã£ã³ã³ãé
ä¿¡
ä»ã®åé¡ã¯äœã§ããïŒ
åã®ã¢ã€ã³ã³ã¯cdnã«ãã£ãŠããŒãããããã©ã³ãã䜿çšããŠããããµã€ãºã¯ãã³ããŒã«åæ ãããŸããã svgã¢ã€ã³ã³ããã¹ãããããã®ããã©ã«ãã®cdnã¯ãããŸããïŒãã¹ãŠã®ã¢ã€ã³ã³ããã£ã³ã¯ã«å
¥ããŠãç¬èªã®cdnããã¹ãã«äœ¿çšã§ããŸãïŒããã®éšåã¯ãã³ããŒã«åæ ãããŸãã
ãã®å·ã§èª¬æããŠããã®ã¯ãããªãŒã®æºããè¡ãæ¹æ³ãã¢ã€ã³ã³ããªã³ããã³ãã§ããŒãããæ¹æ³ã§ãã
ããã蚱容ã§ããªãå Žåã¯ããã¹ãŠã®ã¢ã€ã³ã³ãäžåºŠã«ããŒãããŠãã ãããïŒåé¡ã§ã¯ïŒåé¿ããæ¹æ³ãå°ãªããšã3ã€ãããŸãã
@ afc163
3.9ã®å€æŽãã°ã¯éåžžã«äžèŠªåã ãšæããŸãã ãªãSVGã«å€æŽãããã®ã説æããŸããã§ããã ãã©ã³ãã®æ¬ ç¹ãšãã®å©ç¹ã¯äœã§ããïŒ
ãšããã§ãç§ã¯svgïŒãã®ããã«ã1024 * 1024ãŸã§ã®viewBoxïŒã䜿çšããããšã«å察ããŸããããã¯ãè€åã¬ã€ã€ãŒæäœã®æéã®ãããå¢å ãåŒãèµ·ãããŸãã
@muzea https://ant.design/components/icon/#SVG -icons
@ afc163ããã¯çãããŠãSVGã«å€æŽããå¿ èŠãããçç±ã説æããã«ã¯äžååã§ãã é¢ä¿è ã¯ãsvgã䜿çšããçç±ãšã¢ã€ã³ã³ããªã³ããã³ãã§ããŒãããæ¹æ³ã説æããã®ã«ååã«ç®ç«ã€èª¬æãããŠããŸããã§ãããããããã®åé¡ã®å€ãã®åŠå®çãªææ ã®çç±ã®1ã€ã ãšæããŸãã
@muzeaææ¡ãããããšã
ãã©ãŠã¶ãŒã§ã®svg
ã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã«å¯ŸããviewBox
圱é¿ã¯ã svg
â¥åpath
ãã¹æç»ã®å®çŸ©ãæ°ãããã³ããŒââãã®é¢ä¿ãšæ¯èŒããŠå°ããã§ããé ã«ãè€åå±€ã®æäœã®å¢å ãå®éã«åŒãèµ·ãããã®ã¯ãåŸè
ã倧ããªé ã§ãã
svg
ã¢ã€ã³ã³èªäœïŒå¹
ãšé«ãïŒã倧ããããããšãæå³ããå Žåã倧ããªã¢ã€ã³ã³ã¯ç¢ºãã«æç»ã®è€éãããããããŸãããçžé¢ä¿æ°ã¯æ¯èŒçäœããªããŸããä¿èšŒã§ããã®ã¯ããã¶ã€ããŒããå
¥æããã¢ã€ã³ã³ãåŠçããéçšã§ããŠãŒã¶ãŒã®èªç¥äœéšãå¯èœãªéãåäžãïŒã¢ã€ã³ã³ã倧ããå€åœ¢ããªãïŒããã¹ã®å§çž®ãšé¢é£ããæé©åãæé«ã®å€§ãŸããªç²ŸåºŠã§å®è¡ãããããšã§ããå®éããã©ãŠã¶ãã³ã³ããžã·ã§ã³ã¬ã€ã€ãŒã®æ®µéã§ã¬ã³ããªã³ã°ãããããã«ãããå Žåã¯ã svg sprite
ã¹ããŒã ãèæ
®ãããŸãããããã¯éåžžãããŒãžã«å¯äœçšãè¿œå ããŸãïŒããããŒãŸãã¯ä»ã®äœçœ®ã«é¢é£ããå®çŸ©ãè¿œå ããŸãïŒãããã¯ãã¡ã³ããã³ã¹ãšæ±çšæ§ã®èŠä»¶ãé«ãã©ã€ãã©ãªã®å Žåãèæ
®ãããªãå ŽåããããŸãã
ã©ã®ãããªç¶æ³ã§ã人ã
ã¯èªèã«å€ããWebã¢ããªã±ãŒã·ã§ã³ã¢ã€ã³ã³ãœãªã¥ãŒã·ã§ã³ãšããŠsvg
ãå«ããŸããïŒ
ãã®åé¡ã«é¢ããå ¬åŒã®ãã©ããŒã¢ããã®æ¬ åŠã¯ã確ãã«ãå²ãåœãŠã«å¯Ÿå¿ãã人ã¯åé¡ã解決ããŠããŸããããããã¯ãããããŸããã
@ lizy0329人ãä»äººã®ãã®è¡åã«ã€ããŠæšæž¬ããããšãããšããªãæªæã®ãã人ã¯ãä»äººã«å¹²æžããæš©å©ããããŸããããããããã®äººã¯ãŸã PRã«èšåããããšãæè¿ããŸã
@HeskeyBaozi
ããã¥ã¡ã³ãã®ã¢ã€ã³ã³éšåã®ãã©ãŠã¶ã§ã®ããã©ãŒãã³ã¹ãéåžžã«äœããªã£ãŠããŸãã
å®éãosxã®ã¯ãã ã¯ãããŒãžã«antdã¢ã€ã³ã³ããããããããšãããã©ãŒãã³ã¹ãéåžžã«æªããªããŸãã
ãã¶ãbabel-plugin-macros
ã¯ãã®åé¡ã®è§£æ±ºã«åœ¹ç«ã€ã§ããããïŒ
@ lizy0329人ãä»äººã®ãã®è¡åã«ã€ããŠæšæž¬ããããšãããšããªãæªæã®ãã人ã¯ãä»äººã«å¹²æžããæš©å©ããããŸããããããããã®äººã¯ãŸã PRã«èšåããããšãæè¿ããŸã
ããã¯æªæã®ããæšæž¬ã§ã¯ãªãããå ±éæ§ãæ±ããããšåŒã°ããŸãã HOïŒHOïŒäºä»¶ã¯å¶ç¶ã§ã¯ãªããé·æçãªèç©ã§ããã«éããããŸãããç§ã¯ç§ãã ãŸããŸããã§ãããç§ã¯antdãããè¯ãéçºããåã¢ããããŒãã®çµæãšè§£æ±ºçã«ã€ããŠèãããã ãã§ãã
ããã§ããã€ããã䜿çšã§ããŸããïŒãããžã§ã¯ãã§antdã䜿çšããäœãããªãã£ãã®ã§ããã¿ã³ãã€ã³ããŒãããããã±ãŒãžåããããã³ãã«ã177kãã1.1mã«å€æŽããŸãã...ã¢ãã©ã€ã¶ãŒããããèŠãŠããããã¢ã€ã³ã³ã§ããã倧ãã
䜿çšããŠããªããšãã«ãã³ãã«ããã¢ã€ã³ã³ãåé€ããæ¹æ³ã¯ãããŸããïŒ
create-react-appã§ãªãŒããŒã©ã€ãã䜿çšããŠããŸãã ãã®ããã§ãïŒ
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
}),
@ qaiser110ã®ãœãªã¥ãŒã·ã§ã³ãantd@3
ãã§ãã¯ããå¿
èŠããããŸãã
antd
ãœãŒã¹ã¯ãã¹ãŠã®ã¢ã€ã³ã³ã®ã¯ã€ã«ãã«ãŒãã€ã³ããŒããè¡ãããããã³ãã«ãµã€ãºã¯èšå€§ã§ãã ãªã³ã¯ãã¹ãäžèšã®æº¶æ¶²ã¯WebPACKã®äœ¿çšããããšã§ãresolve.alias
ãªãã€ã¬ã¯ãããããã«@ant-design/icons/lib/dist
ããæ¡ããéžãã ã¢ã€ã³ã³æã€ã«ã¹ã¿ã ãã¡ã€ã«ãžã®ã€ã³ããŒãã@ant-design/icons
ã
倧ããªãã³ãã«ãçšæããããã¯ãŸãã§ãããã¢ã€ã³ã³ãæåã§éžæããå¿
èŠããããããããã§ãçæ³çã§ã¯ãããŸããã ãã ããéåžžã¯å¿
èŠã«å¿ããŠãã§ãªãŒããã¯ãè¡ããŸãïŒã¢ã€ã³ã³ããªãå ŽåïŒã äœãå³éžããå¿
èŠãããããç解ããã«ã¯ã antd
ãšãœãŒã¹ã³ãŒããæ€çŽ¢ããŠã䜿çšãããŠããã¢ã€ã³ã³ãæ¢ããŸãã
antd
ãœãŒã¹ããå³éžãããã¢ã€ã³ã³ã®å
±æãã¡ã€ã«ãŸãã¯ããã±ãŒãžããããšäŸ¿å©ã§ãã ãã®ããã«ãç§éã¯ç§éèªèº«ã®æºã®ããã®ãã§ãªãŒãããã³ã°ã«ã€ããŠå¿é
ããå¿
èŠãããã ãã§ãã ãããã¢ã€ãã¢ã®èŠç¹ã§ãã antdã³ã³ããŒãã³ãããšã¯ã¹ããŒãããã¢ã€ã³ã³ãã°ã«ãŒãåããããšãã§ããantdãœãŒã¹ã調ã¹ãŠæåã§ãã§ãªãŒããã¯ãã代ããã«ãã«ã¹ã¿ã ã¢ã€ã³ã³ãã¡ã€ã«ã«export * from 'antd-cherry-pick-icons/icon'
ãå
¥ããããšãã§ããŸãã ããã¯ã antd
ãœãŒã¹ã䜿çšããŠå¯èœãªéãææ°ã®ç¶æ
ã«ä¿ã€ããã®ã³ãã¥ããã£ã®åªåã«ãã£ãŠè¡ãããšãã§ããŸãã
@LucasBassetti ãã¢ã€ã³ã³ã¯å¿
èŠãããŸãããïŒ <Icon />
çŽæ¥äœ¿çšããŠããªãå Žåã§ããäžéšã®antd
ã³ã³ããŒãã³ã㯠`ã䜿çšããŸã<Alert />
ã§ãã
antd 4.0ïŒã¢ã«ãã¡çïŒã§ã¯ãã¯ã€ã«ãã«ãŒãã€ã³ããŒãã䜿çšããåã³ã³ããŒãã³ãã®ã€ã³ããŒããå³éžããŸãã
ä¿®æ£ããããŸã§ç§ã®ããã«åããäžæçãªè§£æ±ºçïŒantd> = 3.9ïŒ
- ã¢ã€ã³ã³ãç°ãªãæ¹æ³ã§è§£æ±ºããããã«webpackãé©å¿ãããŸãã Webpackæ§æã§ïŒ
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ã䜿çšãããŠããããã¿ã³ãå°å ¥ãããŠããŸããç¬éãšã¢ã€ã³ã³ããªã³ã¯ããã ãã§ããã¢ã€ã³ã³ãã¡ã€ã«ã®ãµã€ãºã¯50äžãè¶ ããŠããŸãã
@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ïŒ
- ã¢ã€ã³ã³ãç°ãªãæ¹æ³ã§è§£æ±ºããããã«webpackãé©å¿ãããŸãã Webpackæ§æã§ïŒ
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ïŒ
- ã¢ã€ã³ã³ãç°ãªãæ¹æ³ã§è§£æ±ºããããã«webpackãé©å¿ãããŸãã Webpackæ§æã§ïŒ
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ïŒã§åäœããããã«ãªããŸãã-ãã¶ã€ã³/åé¡/ 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";
ããšãã°ãäžèšã®LoadingOutlined
ã¢ã€ã³ã³ã¯ã Button
ã³ã³ããŒãã³ãã«å¿
èŠã§ãã ãã®ãã¡ã€ã«ã«å¿
èŠãªãã¹ãŠã®ã¢ã€ã³ã³ãè¿œå ããŸãã ãŸãããã®ãã¡ã€ã«ãåå©çšããããšãã§ããŸãã ãã ãã @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-importgithubã§æžããŠããŸããããã£ãšå€ãã®äººãããã«ããããã«ãããã®èª°ãããã®åé¡ãæ±ããŠããã®ãããããŸããã 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ã䜿çšããŠããŸãã DepsïŒ
"@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ãããããã«$ 142.10ãå ±ãã@vagusx ã 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ãå¿ èŠãšããã¢ã€ã³ã³ã®ã¿ãæäŸããŸãã ãŸããããªãŒã·ã§ã€ã¯ãæå¹ã«ããããšãã§ããªãã£ãããããã³ãã«ãµã€ãºãå€§å¹ ã«åæžããŸããããã®ããããã¶ã€ã³/ã¢ã€ã³ã³ããã±ãŒãžå šäœãå«ãŸããŠããŸããã
[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 />
ããããä»ã§ã¯çŽæ¥ã³ã³ãã€ã«ããããšã¯äžå¯èœã§ããåçèªã¿èŸŒã¿ãæ©èœããŠããªãããã§ã
@ afc163
[email protected]ã«ã¢ããã°ã¬ãŒãããŠãã ããããã®åé¡ã¯å®å šã«è§£æ±ºãããŠããŸãã
20661
解決ãããã©ããã¯ããããŸããã ããã±ãŒãžã«ã¯ãŸã ãã¹ãŠã®ã¢ã€ã³ã³ãã³ãã«ãå«ãŸããŠããŸãã
ãã¹ãŠã®ã¢ã€ã³ã³ããã®æ¹æ³ã§ã€ã³ããŒãããŸããã
ã@ ant-design / iconsãã䜿çšããŠã
ãã®èšå®ããããŸã
{
"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'
@thangbn
[
"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'
@Xezââzonã¯ãæåã®ã¢ã€ã³ã³ã¢ãžã¥ãŒã«ãèŠã€ãããªãããšãçŽæ¥ç€ºããŠããŸãã babel-plugin-importæ§æãè¿œå ããããšããŸããããããã§ãæ©èœããŸããã
@nwoeddie
[ "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
@nwoeddie
[ "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ã !ãç§ã®èšå®ã¯æ©èœããŸãããã€ã³ããŒããªãã·ã§ã³ãåäžã«åå²ããŸããããããã䜿çšãããŠããŸããã å®å šãªèšå®ãåŠã¶ããšã¯ã§ããŸãã
ããã¯babel7ã®æ£ããæ§æã§ã¯ãããŸãããã€ã³ããŒããã©ã°ã€ã³ã¯é åããµããŒãããŠããŸããã æ£ããæ¹æ³ïŒ
["import", { "libraryName": "antd", "libraryDirectory": "es", "style": true}, "ant"],
["import", {
"libraryName": "@ant-design/icons",
"libraryDirectory": "es/icons",
"camel2DashComponentName": false
}, "ant-design-icons"],
æãåèã«ãªãã³ã¡ã³ã
ð¢é çã ã ã ãããããã ã ã