çŸåšãES2015ã§èšè¿°ãããNPMããã±ãŒãžïŒç¹ã«ã³ã³ããŒãã³ãïŒããã©ã³ã¹ãã€ã«ããã«åºè·ããŠãã人ãããŸãã
Next.jsãCRAïŒãã©ã³ã¹ãã€ã«ãè¡ãïŒã®ãããªãããžã§ã¯ãã§äœ¿çšããå Žåã¯ç¹ã«ãããã¯ããªãè¯ãããšã§ãã ãããã¯æ¬¡ã®ãããªå©ç¹ãæäŸããŸãïŒ
ãããããããè¡ãããšã¯ã§ããŸãããnode_moduleså ã®ãã¹ãŠãbabelãã©ã³ã¹ãã€ã«ããé€å€ããŸãã
ã ããããããææ¡ããã解決çã§ãã
next.config.js
ã«ãbabelãééããå¿
èŠã®ããã¢ãžã¥ãŒã«ãå«ããããã®ãšã³ããªããããŸãã èŠãïŒ
module.exports = {
transpileModules: [
"my-component",
"redux/src"
]
}
webpack()
æ¡åŒµåã§å®è¡ã§ããªãã®ã¯ãªãã§ããïŒtranspileModules
æ¹ãããã§ãããããwebpackïŒïŒæ¡åŒµæ©èœã§å®è¡ã§ããªãã®ã¯ãªãã§ããïŒ
ç§ã¯ããªããã«ã¹ã¿ã webpackèšå®ãæå³ããããšãé¡ã£ãŠããŸãã ããã¯å®è¡å¯èœã§ãã ããããããã¯æ¢åã®ããŒããŒã«ãããŸãã ãããååŸããã®ã¯å°ãé£ããã§ãã
transpileModules
æ¹ãããã§ãã
çŽ æŽãããã æŽæ°ããŸãã
æ£èŠè¡šçŸãåãå ¥ããŸããïŒ
ããã ãã¡ããã
ããã
ç§ã¯èªåã®ãŠã§ããµã€ããå§ããŠããã®ã§ãLerna / Next / Styled ...ã®ãããªæ°ããæè¡ãè©ŠããŠããŸããããã«ã€ããŠã¯ãæ©ã段éã§ãã£ãŒãããã¯ãæäŸãããŠããã ããŸãã
NextJsã¢ãžã¥ãŒã«ã§CRAããŒã¹ã®ã¢ãžã¥ãŒã«ãã€ã³ããŒã/ãã©ã³ã¹ãã€ã«ããããšãããããã©ã³ã¹ãã€ã«ãå®è¡ããæ¹æ³ãããããªããšããéè€ããåé¡ãéããŸããïŒã¢ãžã¥ãŒã«ãã¹ã¿ã³ãã¢ãã³ãšããŠå®è¡å¯èœã«ããŠããããããšã«æ³šæããŠãã ããïŒ
ãŸããåããLernaãããŒã¹ã«ããŠããBabelããã¢ãžã¥ãŒã«ãå ¬éããåã«åã¢ãžã¥ãŒã«ããã©ã³ã¹ãã€ã«ããŠããããšã«ãæ°ã¥ããŸãããã @ arunodaãææ¡ããããã«ãã¯ã©ã€ã¢ã³ãã¢ããªã«ãã©ã³ã¹ãã€ã«ãå®è¡ãããæ¹ãããããã§ãã
ã¯ã©ã€ã¢ã³ãçšã«åäžã®babelæ§æãçšæãããã®æ§æããã¹ãŠã®åé¢ãããã¢ãžã¥ãŒã«ãšå ±æããããšæããŸãã Next runnerã®å€éšã§ã¢ãžã¥ãŒã«ãã¹ã¿ã³ãã¢ãã³ãšããŠå®è¡ããæ©èœãç¶æãããå Žåãããã¯ããããããã»ã©ç°¡åã§ã¯ãããŸããã
ç§ã®çŸåšã®ãã¹ããããžã§ã¯ãã¯ããã«ãããŸãïŒ https ïŒ @arunodaããªãã¯ããã«åãçµãã§ããŸããïŒ
@slorberã¯çŸåšã2.0ãªãªãŒã¹ã«çŠç¹ãåœãŠãŠãããå¯èœãªéã埮調æŽããŠãã°ãèŠã€ããŠããŸãã
ç§ã¯ããã«åãçµãã§ããŸãããã2.0ã®çŽåŸã«ãããè¡ãããšãã§ããŸãã
ããŠããã©ãŒã¯ãäœããŸãã éèŠãªWebãµã€ããæ§ç¯ããŠããããwebpack 1.13ãjsnextïŒmain / moduleãã£ãŒã«ãã解決ãããšã¯æããªãããããã§ã«2.0.0ããŒã¿çã«å¯ŸããŠå®è¡ããŠããŸãã
ç§ã¯ãã³ãã©ãŒã®å°é家ã§ã¯ãããŸããããpackage.jsonã®ãã¢ãžã¥ãŒã«ããã£ãŒã«ãã䜿çšããããšæããŸãã ç§ã®ç¥ãéãããã¡ã€ã³ãã¯ãã§ã«ãã©ã³ã¹ãã€ã«ãããã³ãŒãã®ããã§ãã ããããwebpackã®èšå®ã§ã¯ãtranspilationãå«ãããé€å€ãããã§ãããããé¢é£æ§ããããã©ããã¯ããããŸããã 3ã€ã®ãã£ãŒã«ãã®ã©ãã䜿çšãããã®ãã«ã€ããŠã®æšå¥šäºé ã¯ãããŸããïŒ
@slorber webpackã¯NPMãšåãããã«main
ãããµããŒãããŠããªããšæããŸãã ããªãã¯ããã䜿ãããšãã§ããŸãã
next.conf.js
ã®exclude
é¢æ°ã§ãã¡ã€ã«ãã¹ã確èªã§ããŸã
ããŒããNext 2.xã«å¯ŸããŠå®éã«èŠããã®ã«ãããšãã¢ãžã¥ãŒã«ã¯æ©èœããŸããïŒãã ãããã©ã³ã¹ãã€ã«ãããŠããªããããå®è¡æã«å€±æããŸãïŒã jsnextïŒmainã¯æ©èœããŸããã§ããïŒç§ãèŠããŠããéãïŒã ããããããã¯ãµããŒãããŸãã
ãšã«ããã jsnextïŒmainãŸãã¯moduleã¯ãã®åé¡ã®è§£æ±ºçã§ã¯ãªãããã§ãããããã£ãŠã瀟å ã¢ãžã¥ãŒã«ã®å Žåã¯ãå€æãæå¹ã«ããã ãã§ããããååã§ãã
ã³ãã¥ããã£ã¯1ã€ã®ã¢ãããŒãã«åæããŠããŸããããïŒ ããšãã°ãä»ã®react-youtube
ããã®ãŸãŸäœ¿çšããŠããåé¡ã¯ãããŸããã§ããã å
¬éããåã«å€æ°ã®ã¢ãžã¥ãŒã«ããã©ã³ã¹ãã€ã«ãããšæããŸããïŒ
åç §ïŒ https ïŒ
ã¯ããã¢ãžã¥ãŒã«ã誰/ã©ã®ããã«æ¶è²»ãããããããããã¯ã©ã€ã¢ã³ãã«ã©ã€ãã©ãªã«é©åãªbabelèšå®ãã»ããã¢ãããããããªãã®ã§ãå ¬éããåã«åžžã«ãã©ã³ã¹ãã€ã«ããã®ã¯çã«ããªã£ãŠããŸãã ãããRollupãææ¡ããŠããããšã§ãããã³ãã©ãŒãã©ã¡ãã䜿çšãããã決å®ã§ããããã«ãããŸããŸãªæ¹æ³ã§ãã©ã³ã¹ãã€ã«ãããã¢ãžã¥ãŒã«ãå ¬éããããšã§ãã
ãã ããäŒç€Ÿã®å éšããã±ãŒãžã®å Žåããã©ã³ã¹ãã€ã«èšå®ã¯è€æ°ã®ãããžã§ã¯ãã§åãã§ããå¯èœæ§ãããïŒbabelããªã»ãããªã©ïŒãã¯ã©ã€ã¢ã³ããã³ãã©ãŒã«äŒç€Ÿã®ãã¹ãŠã®äŸåé¢ä¿ããã©ã³ã¹ãã€ã«ãããããšã¯çã«ããªã£ãŠããŸãã
@slorberã«éåžžã«åæããŸããããã¯ããããžã§ã¯ããåå²ããŠå¯èœãªéãåé¢ããå Žåã«ãå éšã¢ãžã¥ãŒã«ã«ãšã£ãŠéåžžã«äŸ¿å©ã§ãã
ãããŠãæ£èŠè¡šçŸããµããŒããã@rauchg / @arunodaã¯æ¬åœã«çŽ æŽãããã®ã§ãããšãã°NPM orgåå空éã䜿çšããŠãäŒç€Ÿã®ãã¹ãŠã®å éšã¢ãžã¥ãŒã«ããã£ãããã1ã€ã®ãšã³ããªãæã€ããšãã§ããŸãã
// next.config.js
module.exports = {
transpileModules: [
/^\@my-npm-org\/.*/
]
}
çŸããææ¡@philcockfield
ãããå€åããã¯ããã€ãã®ããªã»ãããæäŸãã䟡å€ããããããããŸããã ã»ãšãã©ã®ããŒã«ïŒLerna / npmãªã³ã¯...ïŒã¯ã·ã³ããªãã¯ãªã³ã¯ã«äŸåããŠããããã«èŠããã®ã§ã次ã®ãããªåçŽãªãã®ã䜿çšããªãã®ã¯ãªãã§ããã
`` `javascript
module.exports = {
transpileModulesïŒ["ã·ã³ããªãã¯ãªã³ã¯"]
}
ãã
next.js
ãæ¬æ Œçã«äœ¿çšãããã®åšãã«ã¢ãžã¥ãŒã«ã®è±å¯ãªã©ã€ãã©ãªãæ§ç¯ããã°ããã»ã©ããã®æ©èœã¯ããéèŠã«ãªããŸãã ããã¯ãå
éšã¢ãžã¥ãŒã«ã®babelã³ã³ãã€ã«æé ãè€è£œããå®éã®PITAã«ãªãã€ã€ãããŸãã
ðð€
ç§ã¯ä»æ¥ããã«åãçµãã§ããŸã:)
@philcockfieldãããè©ŠããŠã¿ãŠãã ããïŒ https ïŒ
ããããšã@arunoda
ãããã£ãŠãPRã§ã³ã¡ã³ããããŠããããã«ããããã·ã³ããªãã¯ãªã³ã¯ããµããŒãããŠããªãå Žåãnpm linkãŸãã¯Lernaã§ã¯æ©èœããªããããæ©èœã¯å°ãå¶éãããŸããããã©ã³ã¹ãã€ã«ãããŠããªãnpmã¢ãžã¥ãŒã«ã«å¯ŸããŠã®ã¿æ©èœããŸãïŒå³ïŒä»ã«ã¯è¡šç€ºãããŸããïŒ /node_modules
å
ã§ã¢ãžã¥ãŒã«ãã³ãããããªãéãã®ãŠãŒã¹ã±ãŒã¹ïŒ
ã·ã³ããªãã¯ãªã³ã¯ããµããŒãããªãã®ã¯ãªãã§ããïŒ ãµããŒãããã®ã¯é£ããã§ããïŒ
ãŸããã¢ããªã§ãã©ã³ãããã¹ããããã£ãã®ã§ããããããè¡ãããã®æè¯ã®æ¹æ³ãããããŸããã ãã©ã³ããç°¡åã«ãã¹ãã§ãããã¹ã¿ãŒã«ââãšã£ãŠããã»ã©èŠçã§ã¯ãªãæ¢ç¥ã®æé ã¯ãããŸããïŒ ç§ã¯æ¬¡ã®ãããªãã®ãè©ŠããŸããïŒ
çŸåšãã©ãŒã¯ããã¹ãããæè¯ã®æ¹æ³ã¯äœã§ããïŒ
next.config.js
ïŒ module.exports = { webpack: (config
ã§ãããè¡ãããšãæ€èšããŠããå Žåã config.module.rules
ã«ã¯ããã€ãã®ããšããããŸãããããã®ã«ãŒã«ã®ãããããå€æŽããå¿
èŠãããããã«èŠããŸããããããšãè¿œå ããå¿
èŠããããŸããïŒ ïŒ
{ loader: 'babel-loader',
include: '/Users/me/gh/guide/node_modules/next/dist/pages',
options:
{ babelrc: false,
cacheDirectory: true,
sourceMaps: 'both',
plugins: [Object] } },
{ test: /\.js(\?[^?]*)?$/,
loader: 'babel-loader',
include:
[ '/Users/me/gh/guide',
'/Users/me/gh/guide/node_modules/next/dist/pages' ],
exclude: [Function: exclude],
query:
{ babelrc: true,
cacheDirectory: true,
sourceMaps: 'both',
presets: [] } } ]
ææ¡ãããããåçŽãªæ§æã楜ãã¿ã«ããŠããŸãã
ç§ã®ç¡ç¥ã®ããã«ç³ãèš³ãããŸãããããã®åé¡ã®è§£æ±ºçãããããŸãããïŒ es6ãã³ãŒãããŒã¹ã«ã€ã³ããŒããããã®ã§ãããªãŒã·ã§ã€ã¯ãå¿ èŠã§ãã
ããã«é¢ããPRã¯ãããŸããïŒ
@andrewmclaganãã®åé¡ã¯ãŸã æªè§£æ±ºã§ãããé¢é£ããPRãããããããããã¹ãŠãæºè¶³ãããããšã¯ã§ããŸããïŒLernaJSãŠãŒã¶ãŒãªã©ïŒ
ããã®ç¶æ³ã¯ã©ãã§ããïŒ node_modulesããã€ã³ããŒãããããã¡ã€ã«ããã©ã³ã¹ãã€ã«ããããã«nextã®webpackãäœæããä»ã®æ¹æ³ã¯ãããŸããïŒ
@slorberç§ã¯PRãèŠãŠãããŸãã ãŠãŒã¹ã±ãŒã¹ã«è²¢ç®ããŸãã
ç§ã¯ããçš®ã®åæ§ã®åé¡ã«çŽé¢ããŠããŸãã get-urls
ããã±ãŒãžã䜿çšããããšããŠããŸãã äœåã¯dev
èŠã€ãããŸãããã³ã³ãã€ã«ãããšã uglifyãããšã©ãŒãçºçããŸãã
...
{ Error: commons.js from UglifyJs
...
ããã«å¯Ÿããåé¿çã¯ãããŸããïŒ
ã¢ã«ããã¯ããã§ãã€ãããã«åãçµãã§ãããã 圌ã¯ä»¥åïŒ749ã§ãã£ãããšããããŸã
ãã®æ©èœãå®è£ ãããã®ã楜ãã¿ã«ããŠããŸãã @philcockfieldãè¿°ã¹ãããã«ãNext.jsã®å€æã«äŸåããã¢ãžã¥ãŒã«ã®ã©ã€ãã©ãªãæ§ç¯ããããšã¯äžè¬çãªã·ããªãªã§ããããããžã§ã¯ãéã§ã³ã³ããŒãã³ããå ±æã§ããã®ã¯çŽ æŽãããããšã§ãã
ããã¯ãæšã®æºãã«å¿
èŠãªã ãã§ã¯ãããŸããã styled-jsx
ãããªbabelãã©ã°ã€ã³ã«ã䜿çšã§ããŸãã ãããã£ãŠãbabelãã©ã°ã€ã³ã䜿çšããã¢ãžã¥ãŒã«ïŒã©ã€ãã©ãªãªã©ïŒãããå Žåãæåã®è§£æ±ºçã¯ãES6ãœãŒã¹ã³ãŒããå«ããŠãã¢ããªãnode_modulesããããããã©ã³ã¹ãã€ã«ã§ããããã«ããããšã§ãã ãã¡ãããnextã«ã¯ãã§ã«ããã©ã«ãã§styled-jsx
ããŠããŸãã
ãããç§ãããããšã§ã
// next.config.js
exports.webpack = config => (config.module.rules = config.module.rules.map(({exclude, ...rest}) => ({
exclude: Object.prototype.toString.call(exclude) === '[object Function]' ? (str => !/mycomponents/.test(str) && exclude(str)) : exclude,
...rest
})), config);
åºæ¬çã«ãåexclude
ãã«ã¹ã¿ã é¢æ°ã«çœ®ãæããŸããã
äœãééã£ãŠããã®ãããããŸããããããŸãæ©èœãããããšã¯ã§ããŸããã
node_modules/mycomponents
ã®ã³ã³ãã³ããNext.jsã«ãã£ãŠãã©ã³ã¹ãã€ã«ãããå¿
èŠããããŸã
空ã®é åã§ãã¹ãŠã®é€å€ãå®å šã«ãªãŒããŒã©ã€ãããŠãæ©èœããŸãã
exports.webpack = config => (config.module.rules = config.module.rules.map(({exclude, ...rest}) => ({
exclude: [],
...rest
})), config);
ç§ãå©ããŠãã ãã ïŒïŒ
ããããšã
ããã¿ããªïŒ @thealjey ïŒç§ã¯ä»ãŸã§äœã¶æãjsnext:main
ãã¯ãŒãã¢ãžã¥ãŒã«ããã©ã³ã¹ãã€ã«ããŠããŸããã
jsnext:main
ãpackage.jsonã«ããå Žåã¯ãæå®ããããšã³ããªãã€ã³ãããã©ã³ã¹ãã€ã«ããŸãããã以å€ã®å Žåã¯ã main
ãã®ãã€ã³ããŒãããŸããnext.js
ã¯äœ¿çšããŠããŸããããã圹ã«ç«ãŠã°å¹žãã§ãã
@damianobarbatiããããæ®å¿µãªããããã§ã¯ãããŸãã
é£ããããšã§ã¯ãªããã®ããã©ã³ã¹ãã€ã«ããããã«webpackãçŽæ¥æ§æããŸãããNext.jsã®ã³ã³ããã¹ãã§ãããæ©èœãããã®ã«èŠåŽããŠããŸã
ããã誰ãã解決çãèŠã€ããŸãããïŒ
ãããžã§ã¯ãã«ã€ã³ããŒãããå¿ èŠãããããŒã«ã«ES6ãªã³ã¯ããŒãã¢ãžã¥ãŒã«ããããŸãããwebpackããŒãã¥ãŒãæ£ããååŸã§ããŸããïŒ
ããè¯ãæ¹æ³ããããšç¢ºä¿¡ããŠããŸããããã«ãæã«ãã¹ãŠãbabelã§å®è¡ããŸãã
next build && babel .next/*.js --out-dir . --presets=es2015,react
ããã¯æ»ã«ãŸãããïŒ ã«ã¹ã¿ã ã¢ãžã¥ãŒã«ããã©ã³ã¹ãã€ã«ããæ¹æ³ãæ¢ããŠããŸããããŸã äžå¯èœãªããã§ãã
@mattfeltenããã¯v5ã®ããŒããããã«ãããŸãð
誰ããããã®åé¿çã®äŸãæã£ãŠããŸããïŒ
@timneutkensããã®ã¿ã€ã ã©ã€ã³ã¯ãããŸããïŒ ããã¯ãã°ãã°äžå¯èœãªè³ªåã§ããããšãç解ããŠãã ããããããç§ãã¡ã¯ä»ã®ãšããä»äºäžã®ã¹ã¿ãã¯ã決å®ããããšããŠããŸãããããŠããã¯ç§ãã¡ã«ãšã£ãŠããªã倧ããªãããã«ãŒã§ãïŒ :)
åé¿çã®ææ¡ãæå¹ã§ãã
@thealjeyã¯ããããå€ãã³ã¡ã³ãã§ããããšãèªèããŠããŸããããªãŒããŒã©ã€ãããå¿
èŠãããinclude
æå®ãããŠããããããœãªã¥ãŒã·ã§ã³ãæ©èœããªãã£ãå¯èœæ§ããããŸãã
æŽæ°ïŒãã®æŠç¥ãæ€èšããŸããããnext.jsã®å éšæ§æå ã®ããŸããŸãªã¢ãžã¥ãŒã«ãã£ã¬ã¯ããªã®ãã¹ãŠã®ããŸããŸãªããŒããŒãèãããšãããã¯æ£æ°ã§ã¯ãããŸããã ããã¯ãã¡ãŒã¹ãã¯ã©ã¹ã§ããå¿ èŠããããŸãã
@chrisuiç§ã®ïŒäžæçãªïŒè§£æ±ºçã¯ã次ã®ããã«æ§æãããbabel-plugin-module-resolverã䜿çšããããš"plugins": [["module-resolver", {"root": ["./"]}]]
-
ããã¯æ±ºããŠå®ç§ãªè§£æ±ºçã§ã¯ãããŸããããä»ã®ãã¹ãŠã倱æããã®ã§ãä»ã®ãšããã¯æ©èœããŸã
ãã®ãããã§ãã€ã³ããŒãã®ãã³ã«ããããã®../
ãæžãå¿
èŠã¯ãããŸããã
ããã¯å®éã«ã¯äžéšã®äººã«ãšã£ãŠã¯ããè¯ã解決çãããããŸãããã確ãã«åå©çšæ§ã«ã¯åœ¹ç«ã¡ãŸãã
@thealjeyäŸãæããŠ
ç§ã¯ãããç¡é§ã«ããããšãããããžã§ã¯ãã®ã»ããã¢ãããæã£ãŠããŸã...
https://github.com/jamesgorrie/nappy
ç§ãã¡ã®ç掻ããšãŠã楜ã«ãªãã®ã§ãåãã§PRãååŸããŠã¿ãŸããã次ã®ãããªããã€ãã®è³ªåããããŸãïŒ next.js
ã¯ç¹å®ã®ã¢ãžã¥ãŒã«ã®ãã©ã³ã¹ãã€ã«ããµããŒãããå¿
èŠããããŸããããããšããã©ã³ã¹ãã€ã©ãŒæ¬¡ç¬¬ã§ããã next.js
ã¯ãã¢ãžã¥ãŒã«ã®è§£æ±ºã«å³å¯ã«åŸããŸãã next.js
åå¿è
ãšããŠã誰ã«å°ããããã©ãããå§ããã°ãããããããªãã
v5ã®ããŒããããã«ãããŸãð
@timneutkensããã¯v5ã«ãªããŸãããïŒ
ç¥ãããã
ããŒãžãããå ŽæãèŠãŠãã ããã ããã¯8æ¥åã«ããŒãžãããŸããã 5.0.0ã¯2æ¥åã«ãªãªãŒã¹ãããŸããã ãããããŒãžãããã«ããªã¢ãã©ã³ããã...
ãããã©ã®ããã«å®è£ ã§ãããã«ã€ããŠã®äŸã¯ãããŸããïŒ äžèšã®ããã«ããã®ããã«åäœããã¯ãã§ããïŒ
module.exports = {
transpileModules: ['my-npm-module']
}
ãŸãã¯ããã¯ç°ãªã£ãŠèŠããŸããïŒ
ããããããŸããã @timneutkensäžèšã®ãªã³ã¯ã¯ããŸã éããŠããPRãžã®ãªã³ã¯ã§ãã ããã¯ãŸã v5ã«ããŒãžãããŠããŸãããïŒ
ç·šéïŒæ°ã«ããªãã§ãã ãããããã¯äŸã匷調ããããã®åãªãPRã§ãã
ããã¯äŸã§ããããŒãžããã«äŸã䜿çšã§ããŸãã transpileModules
ã¯ãåŸã§åãçµããã®ã§ãã
äžè¬çãªçµéšåãšããŠïŒåé¡ãéããŠããå Žåãããã¯ãªãªãŒã¹ãããŸããã
@brianyinglingãã®äŸãæ«å®ãœãªã¥ãŒã·ã§ã³ã®ãã©ã°ã€ã³ã«å€ããŸããïŒv5ã®ã¿ïŒã
ããå
ç¢ã§å
¬åŒãªãœãªã¥ãŒã·ã§ã³ãå°å
¥ããããŸã§ãçŸæç¹ã§ã¯æ©èœããŠããŸãã
https://www.npmjs.com/package/@weco/next -plugin-transpile-modules
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãããŒã¹ã®åäžã¢ãžã¥ãŒã«ã«ã€ããŠããã®äŸãèŠãŠã¿ãããšæããŸãã
ããšãã°ããµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽã®äž¡æ¹ã䜿çšããã¢ãžã¥ãŒã«ããããŸãã ã¢ãžã¥ãŒã«ãç¬èªã®åå¥ã®ã¢ãžã¥ãŒã«ã«å解ããŠyarn link
ããããwebpackã«ãŒã«ããããã³ã°ããããšã«ãã£ãŠãäžèšã®äŸãæ©èœãããããšãã§ããŸããã§ããã
ç°¡åãªåçŸã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
// pages/index.js
import { foo } from '../lib/test'
export default () => <div>hello {String(typeof foo)}</div>
// lib/test.js
async function foo () {}
module.exports = { foo }
@timneutkensã«ãããšãããã¯å
±æã¢ãžã¥ãŒã«ã§async/await
ã䜿çšããŠããããã§ãã ç§ã®è§£æ±ºçã¯ãasync / awaitãåé€ãããã¹ãŠã.then()
ã¹ã¿ã€ã«ã®ã³ãŒã«ããã¯ã«å€æŽããããšãããããªããšæããŸãã
OKãç§ã¯èªåã«åã£ãä¿®æ£ãèŠã€ããŸããã
ãŸãã httpsïŒ //github.com/zeit/next.js/issues/3018#issuecomment -380879576ã«åŸã£ãŠã config.resolve.symlinks = false
èšå®ãnext.config.js
æ§æã«è¿œå ããŸãã
// next.config.js
webpack: (config, { dev }) => {
config.resolve.symlinks = false
return config
}
次ã«ãå
±æã©ã€ãã©ãªïŒCommonJSãšã¯ã¹ããŒããšasync
/ await
ããŒã¯ãŒãã䜿çšãã.js
ãã¡ã€ã«ïŒãshared
ãšããã¢ããªã±ãŒã·ã§ã³ã®ãµããã£ã¬ã¯ããªã«é
眮ããŸãã
// shared/index.js
async function foo () {}
module.exports = { foo }
// shared/package.json
{
"name": "@myapp/shared",
"version": "1.0.0",
"main": "index.js",
"license": "UNLICENSED",
"private": true,
"dependencies": { ... }
}
ãããŠæåŸã«ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã§èª°ããyarn install
ãããšãã«ããã¹ãŠããªã³ã¯ããpostinstall
ã¹ã¯ãªãããè¿œå ããŸããã
// package.json
{
...
"scripts": {
"postinstall": "cd shared ; yarn -s unlink ; yarn link && yarn && cd .. && yarn link @myapp/shared",
...
ããã§ãMochaãã¹ãããµãŒããŒåŽã§åæ Œããã«ã¹ã¿ã KoaãµãŒããŒãæ£åžžã«èµ·åããNextJSããŒãžã«ã¯ã¬ã€ãžãŒãªCannot assign to read only property 'exports' of object '#<Object>'
ããªããªããŸããã
NextJs 5.1.0ã«ã¢ããã°ã¬ãŒããããšãã«ããããšåãåé¡ãçºçããŸããã 次ã®ããŒãã¢ãžã¥ãŒã«ã®1ã€ãŸãã¯2ã€ã¯ãIE11ã§ãã¡ããã¢ããŒé¢æ°ããã©ã³ã¹ãã€ã«ããããšã©ãŒãã¹ããŒããŠããŸããã§ããã ç§ã¯ä»¥åãåã
ã®polyfillsãèšå®ãããŠããŠããããæåŸã«ç§ã¯ãããã®ã¢ãžã¥ãŒã«ãã¡ã€ã«ãã¿ãŒã²ããã«éžãã babel-polyfill
ç§ã®äžã«next.config.js
ããã§ïŒ
module.exports = {
webpack: (config, { dev }) => {
const polyfill = new Promise((resolve, reject) => {
const originalEntry = config.entry
originalEntry().then(entries => {
if (entries['main.js']) {
entries['main.js'].unshift('./client/polyfills.js')
entries['main.js'].unshift('babel-polyfill')
}
config.entry = entries
resolve()
})
})
config.module.rules.push(
{
test: path.resolve('./node_modules/next/node_modules/'),
loader: 'babel-loader',
options: {
babelrc: false,
cacheDirectory: false,
presets: ['es2015']
}
}
)
return polyfill.then(() => { return config })
}
}
ããã誰ããå©ããããšãé¡ã£ãŠããŸãã
ESMã¯é åã®ããã«æ©èœããŸãã
index.js
ã«ã«ã¹ã¿ã Next.jsãµãŒããŒãããå Žåããã®ã³ãã³ããå®è¡ããŠãµãŒããŒãèµ·åãããšãesmãå®å
šã«èµ·åããLernaã«å¯Ÿç§°åããããããžã§ã¯ãããã±ãŒãžã®ESã¢ãžã¥ãŒã«ã解決ãããŸãã
node -r esm index.js
@curranãã£ããããbabel-nodeã眮ãæããããšã¯ã§ããŸããïŒ
@curranç§ã¯
@blackbingããããŸããã
@thealjeyããã¯ãªãã§ããïŒ
誰ããè¿
éã§ç°¡åãªè§£æ±ºçãæ¢ããŠããå Žåã«åããŠããããç§ãããããšã§ãã ã¹ã¿ã³ãã¢ãã³ããŒãã¹ã¯ãªãããä»ããããã¯ãšã³ããšNextJSãä»ããã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§å®è¡ããã³ãŒãã䜿çšããŠããµããã£ã¬ã¯ããªshared/
ãäœæããŸããã ç¬èªã®package.json
ããããã®ååã@myproject/shared
ãšããŠå®£èšããŸãã
次ã«ãã¡ã€ã³ïŒèŠªïŒãããžã§ã¯ãã§ã次ã®ããã«ã€ã³ã¹ããŒã«åŸã®ã¹ã¯ãªãããpackage.json
ã«è¿œå ããŸããïŒ cd shared && yarn -s unlink >/dev/null 2>&1 ; yarn -s link && yarn -s && yarn link @myproject/shared
â次ã«yarn
ãå°ãªããšã1åå®è¡ããã€ã³ããŒããimport { whatever } from '@myproject/shared/somefile'
å€æŽããŸã
ãã®ããã«ãå
±æã³ãŒãã¯ã¯ã¬ã€ãžãŒãªå€ææé ãªãã§æ©èœããŸããããã«ã yarn link
ã¯æŽæ°ãè¡ããã³ã«ã yarn
/ npm
ãåå®è¡ããå¿
èŠã¯ãããŸãããã·ã³ããªãã¯ãªã³ã¯ã
TypeScriptã䜿çšããŠããå Žåã @weco/next-plugin-transpile-modules
ã¯æ©èœããªãã¯ãã§ãã Nextã®withTypescript
ãåŠçãããã©ãŒã¯ãäœæããŸããïŒ https ïŒ
TypeScriptã«ããµãŒããŒåŽã®ã³ãŒããå¿ èŠãªå Žåã§ããé©åã«åŠçããæ¹æ³ãç解ããå¿ èŠããããŸãã
ããã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
@bogdansoareç§ã¯https://github.com/KeitIG/next-plugin-transpile-modulesã䜿çšããŠã
ãããŠã次ã®èŠç¹ã§ãç§ã«ããããã«å¥ã®ãã®ã TypeScriptãšããã¹ãŠã®ããã±ãŒãžã§ã¯ãªãã @scope
ç¹å®ã®ããã±ãŒãžãåŠçããŸãã https://gist.github.com/trusktr/44400d0d016c506629b4f914799dc9cd
esm
ãšlerna
ã䜿çšããç°¡åãªå®äŸããŸãšããŸããã
https://github.com/curran/nextjs-esm-example
/ cc @jdalton
å人çã«ããã次ã®next.config.js
ïŒ
module.exports = {
webpack: (config, options) => {
config.module.rules.push({
test: /\.js$/,
include: /node_modules/,
use: [
options.defaultLoaders.babel
]
})
return config
}
}
IE11ãšã®äºææ§ãå®çŸããããã«å¿
èŠã ã£ãnode_modules
ãã¹ãŠããããªã³ã°ããŸã...
ãã©ã³ã¹ãã€ã«ãããŠããªãnpmããã±ãŒãžããããžã§ã¯ãã«è¿œå ããã®ã«èŠåŽããŠãããã«å¯Ÿãã解決çããããããã§ãã ä»ã®ãšãããã³ããŒ/ã«ããŠã³ããŒãããå¿
èŠããããŸãã:(
æ¬åœã«å¿ã
ãã
@ bel0v next-plugin-transpile-modules
ãã§ã«ãããéæã§ããã¯ãã ãšæããŸãã ãã®åé¡ã¯ãããã解決ãããã¯ãã§ãã cc / @timneutkens
ããã§ãå¥ã®è§£æ±ºçã調æ»ããããšæããŸãã
æè¿ããžã§ã€ããŒã¯node_modulesã®ã³ã³ãã€ã«ã®åé¡ã«ã€ããŠéåžžã«è©³çŽ°ãªã¹ã¬ãããæžããŸããïŒ https ïŒ//twitter.com/jamiebuilds/status/1080840492525350912
ç§ã¯ãžã§ã€ããŒã®ã¹ã¬ãããèªã¿ãŸãããããã³ãªãŒã»ãã¥ãŒãšããã«ã®ãã®ç¶æ³ãšè§£æ±ºçã«ã€ããŠã®èŠè§£ãå
±æããããšæããŸãã
https://babeljs.io/blog/2018/06/26/on-sumption-and-publishing-es2015+-packages
ïŒãã£ã ã«åæããªããç§ãå ±æããããšæã£ãã ãã§ãå€ãã®è³åŠäž¡è«ããã£ã ã代æ¿ãœãªã¥ãŒã·ã§ã³ã調æ»ããã®ã«åœ¹ç«ã€ãããããŸããïŒ
ãããç§ãã¡ã¯éå»å幎éããã³ãªãŒãå«ããã®åé¡ã«ã€ããŠå€ãã®äººã ãšè©±ãåã£ãŠããŸããð
node_modulesã®ãã©ã³ã¹ãã€ã«ã«é¢ããæžå¿µã«ãããããããç¬èªã®ããã±ãŒãžãã¢ãã¬ãã§ãã©ã³ã¹ãã€ã«ããããšããããšã¯éåžžã«äžè¬çãªèŠä»¶ã§ããããããã®æžå¿µã¯åœãŠã¯ãŸããŸããã
@dcalhounè©ŠããŸããããæ®å¿µãªããäºæããªãããŒã¯ã³ãšã©ãŒãçºçããŸãã ãã®ãã©ã°ã€ã³ã«ã¯ãé¢é£ããŠããå¯èœæ§ã®ããæªè§£æ±ºã®Next7ã®åé¡ããããŸãã
@ bel0v
FAQãèªãå¿ èŠããããŸã;ïŒãã®åé¡ã®è§£æ±ºçããããŸãïŒ //github.com/martpie/next-plugin-transpile-modules#i -have-trouble-making-it-work-with-nextjs-7
ç§ã¯è€æ°ã®ãããžã§ã¯ãã§ãã®ãã©ã°ã€ã³ã䜿çšããŠããŸããããããŠããã¯ä»äºãããŸãããéããŸãã Next 7ã®åé¡ã¯å¥åŠã§ãããããNextããã®ãã®ããBabelããã®ãã®ãã¯ããããŸããããšã«ãããããã§åé¡ãéããŸããïŒ https ïŒ
@martpieããç§ã¯ãããè©ŠãããšæããŸã..ãšã«ããããäžåºŠè©ŠããŠã¿ãŸã
@martpieäžè²«ããbabel.config.jsãšyarnã¯ãŒã¯ã¹ããŒã¹ã§next7ã®äœ¿çšãéå§ããŸããããç°¡åãªäŸãèšå®ã§ãããã©ãããããããŸãã
ããã§åºæ¬çãªäŸããã©ãŒã¯ããŸãã
https://github.com/bel0v/learnnextjs-demo
ãã®äžã§ãç§ã¯å€æãããŠããªãäŸåé¢ä¿ïŒwired-elementsïŒãã€ã³ã¹ããŒã«ãããã«ããšã©ãŒUnhandled Rejection (SyntaxError): Unexpected token {
ãåãåããææ¡ãããæ¹æ³ã§ä¿®æ£ããããšããŸããã
ç§ã¯ãããæ©èœããããã«ããã€ãã®è¿œå ã®babelãã©ã°ã€ã³ãå¿
èŠãããããªããšæã£ãŠããŸã..ð€
å床FAQã®@ bel0vã«ãLernaã»ããã¢ãããæ©èœããªãçç±ã«ã€ããŠã®èª¬æããããŸãïŒTLãDR;ãããã䜿çšããŠããã®ã¯ééã£ãŠããŸãïŒ
@martpieããã
https://twitter.com/jamiebuildsãäžæåæ¢ãããŠããããã§ãã®ã§ãã¹ã¬ãããèªã¿åãããšãã§ããªããªããŸããã ïŒ3018ãã®åé¡ã«é¢é£ããŠééãããã®ã§ãæ€èšãããŠãã代æ¿ã¢ãããŒãã¯äœã§ãããçåã«æããŸããïŒ
ãããã¯ããããã®ãŠãŒã¹ã±ãŒã¹atmã®next.jsã®æå
端/ãã¹ããã©ã¯ãã£ã¹ãè¡šããŠããŸããïŒ
https://github.com/curran/nextjs-esm-example
https://github.com/wellcometrust/next-plugin-transpile-modules
https://github.com/martpie/next-transpile-modules
https://github.com/zeit/next.js/tree/canary/examples/with-yarn-workspaces
ãããã£ãŠãç§ã®ããã«IE11ããµããŒãããå¿
èŠã®ãããããžã§ã¯ãã«åãçµãã§ããå Žåã¯ãå®éã«ã¯ãã¹ãŠã®ã³ãŒããnode_modules/
å
ã«ãã©ã³ã¹ãã€ã«ããå¿
èŠããããŸãã Next.js 7.xã§ã¯ã次ã®èšå®ã䜿çšããŠããŸããããããã¯ããŸãæ©èœããŸããã
æ®å¿µãªãããNext.js 8.xã§ã¯ãããã©ã«ãã®ãšã¯ã¹ããŒãããªãã£ãããã«ã¢ãžã¥ãŒã«ãä»ã®ã¢ãžã¥ãŒã«ãã€ã³ããŒãã§ããªãã£ããšãããšã©ãŒãçºçããŠåäœãåæ¢ããŸããã 次ã«ãNext.js 8.xã®ä»¥äžã®æ§æãæãã€ããŸãããããã¯ã node_modules/
ã®ã³ãŒãã@babel/preset-env
ã§ã®ã¿å€æããä»ã®ãã©ã°ã€ã³ã¯å€æããŸããã
ããã¯ã package.json
browserlist
ããããã£ãèšå®ããããšã§çµã¿åããããŸãã
"browserslist": "defaults, IE >= 11, EDGE >= 14, Safari >= 11, Chrome >= 41, Firefox >= 52",
next.config.js
module.exports = {
webpack: (config, options) => {
config.module.rules.push({
test: /\.js$/,
include: /node_modules/,
use: [
options.defaultLoaders.babel,
],
})
return config
},
}
next.config.js
module.exports = {
webpack: (config, options) => {
config.module.rules.push({
test: /\.js$/,
include: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-syntax-dynamic-import'],
},
},
})
return config
},
}
æ®å¿µãªããããã®ã»ããã¢ããã§@babel/plugin-transform-runtime
ã䜿çšããæ¹æ³ã¯ãŸã ããããŸããããã®ãããã³ãŒãå
ã§ããªãã®æ°ã®ãã«ããŒãåãåºãããå¯èœæ§ããããŸãðããŸãããã°ãgzipããããåŠçããŸãðð
Next.jsãnode_modules/
ãæ£ãããã©ã³ã¹ãã€ã«ããŠãããªããæã£ãŠããbrowserlist
åäœãããªãã·ã§ã³ãæäŸã§ããã°çŽ æŽããããšæããŸãã äŒæ¥ãŠãŒã¶ãŒããããããªå€§èŠæš¡ãªãµã€ãã¯ãå€ããã©ãŠã¶ãé©åã«ãµããŒãããããã«ããã«äŸåããŠããããã§ãã
next-transpile-modules
ïŒ@ jamesgorrieã®ãã°ãããä»äºã«åºã¥ãïŒã®ã¡ã³ãããŒãšããŠãç§ã¯ããã§ãã®åé¡ã«çŽé¢ããŠãã人ãåãã§å©ããŸãã
ç§ã¯ãã®ãã©ã°ã€ã³ã䜿ã£ãŠ1幎以äžããã®ãããžã§ã¯ãã«åãçµãã§ããŸãããããããŸã§ã®ãšããããŸãæ©èœããŠããŸãã
Next.jsããã®ãã€ãã£ããµããŒãã¯ãã¡ããçŽ æŽããããã®ã§ããããã®æ©èœãnext
ããã±ãŒãžã«çµ±åãããæäŒãããããŠããã ããŸãã ãã£ã ãè©Šãããã¢ã€ãã¢ãããã€ãæã£ãŠããã®ã¯ç¥ã£ãŠããŸããããšã«ããã
也æ¯ïŒ
@martpieç§ã¯ããªãã®ãããžã§ã¯ããããã«èª¿ã¹ãŸãããã_all_ã¢ãžã¥ãŒã«ããã©ã³ã¹ãã€ã«ããç°¡åãªæ¹æ³ãèŠã€ããããŸããã§ãããããã¯å¯èœã§ããïŒ âºïž
ãŸãã options.defaultLoaders.babel
ãéžæãããããããã«ããŒããŒãšããŠäœ¿çšããŠããããã§ãã Next.js 8.xã§ãããè¡ããšããã®åŸãäžéšã®ã¢ãžã¥ãŒã«ãCJSã¢ãžã¥ãŒã«ãšããŠæ£ããèªèããããä»ã®ã©ã€ãã©ãªãããããã€ã³ããŒãã§ããªããšããåé¡ããããŸãããäŸïŒ
./pages/_glamor.js
Attempted import error: 'css' is not exported from 'glamor'.
./components/project-selector.js
Attempted import error: 'react-select/lib/Async' does not contain a default export (imported as 'AsyncSelect').
./node_modules/react-select/dist/react-select.esm.js
Attempted import error: 'react-input-autosize' does not contain a default export (imported as 'AutosizeInput').
./pages/signup/full.js
Attempted import error: 'react-select/lib/Creatable' does not contain a default export (imported as 'CreatableSelect').
./components/markdown-editor.js
Attempted import error: 'react-simplemde-editor' does not contain a default export (imported as 'SimpleMDEEditor').
./components/pagination.js
Attempted import error: 'react-js-pagination' does not contain a default export (imported as 'UpstreamPagination').
./node_modules/react-google-recaptcha/lib/es/recaptcha-wrapper.js
Attempted import error: 'react-async-script' does not contain a default export (imported as 'makeAsyncScriptLoader').
./pages/_glamor.js
Attempted import error: 'rehydrate' is not exported from 'glamor'.
ãã®ããã node_modules/
ã«ã¹ã¿ã babelæ§æãæäŸããããã«åãæ¿ããŸãããããã¯ã preset-env
ã䜿çšããŠã³ãŒãããã©ã³ã¹ãã€ã«ããã ãã§ãNext.jsåºæã®å€æãã¹ãããããŸãã ãã®ã¢ãããŒãã«ã€ããŠã©ãæããŸããïŒ
也æ¯ð»
@LinusUãã¶ãtranspileModules: ['(.*?)']
ãè©ŠããŠããããæ©èœãããã©ããæããŠãã ããã
ãã ããå°æ¥ã®ã¡ãžã£ãŒãªãªãŒã¹ã§ã¯æ©èœããªãå¯èœæ§ãããããã泚æããŠãã ããã
ããäžè¬çã«ã¯ã node_modules
ãã©ã«ããŒå
šäœããã©ã³ã¹ãã€ã«ããããšã¯ãå§ãããŸããïŒã匷ããå§ãããŸããããšèªãã§ãã ããïŒãã³ã³ãã€ã«ã«ã¯æ°žé ã«æéãããããããã±ãŒãžã¯ES3äºæã³ãŒãïŒIE11äºæïŒãæäŸããå¿
èŠããããŸãã
å¿
èŠãªã¢ãžã¥ãŒã«ã ãããã©ã³ã¹ãã€ã«ããŠãã ããïŒ ïŒ lodash-es
ãããŒã«ã«ã¢ãžã¥ãŒã«ãªã©...ïŒ
ããã±ãŒãžã¯ES3äºæã®ã³ãŒããæäŸããå¿ èŠããããŸãïŒã€ãŸãIE11äºæïŒã
ããã¯ç§ãèŠãçŸå®ã§ã¯ãããŸããããããŠç§ã¯å®éã«åæããŸããã ã¢ãžã¥ãŒã«ã®äœæè ã¯ãç§ãã¿ãŒã²ããã«ããŠãããã©ãŠã¶ãŒãæ£ç¢ºã«ç¥ãããšã¯ã§ããŸãããå€ãã³ãŒããåºè·ãããšãææ°ã®ãã©ãŠã¶ãŒãã¿ãŒã²ããã«ããŠãããŠãŒã¶ãŒã«ããã«ãã£ãŒãç§ãå¯èœæ§ããããŸãã
ã³ã³ãã€ã«ã«ã¯æ°žé ã«ããããŸã
èµ·åæã¯å°ãé ãã§ããããã®åŸã¯ãã£ãã·ã¥ãããŠããããã§ãç¹å®ã®ããŒãžã«å€æŽãå ãããšãã»ãŒç¬æã«ãªããŒããããŸãã
å¿ èŠãªã¢ãžã¥ãŒã«ã ãããã©ã³ã¹ãã€ã«ããŠãã ããïŒ
ããã«ã¯ãIE11ãšäºææ§ã®ããããã±ãŒãžãšäºææ§ã®ãªãããã±ãŒãžãæ£ç¢ºã«ææ¡ããäŸåé¢ä¿ïŒäžæçãªäŸåé¢ä¿ãå«ãïŒãå€æŽããããšãã«ãã®æ å ±ãææ°ã®ç¶æ ã«ä¿ã€å¿ èŠããããŸãã ãããã©ã®ããã«çŸå®çãããããŸããð€
éèŠãªããšã¯ãpackage.json module
æäŸãããESMãšã³ããªãã€ã³ãã¯ãéåžžãããªãŒã·ã§ã€ã¯çšã®ES6ã€ã³ããŒã/ãšã¯ã¹ããŒããåããES5ã§ãããšããããšã§ãã ãããã£ãŠãç¹ã«æèšãããŠããªãéããããã¯ãã³ãã©ãŒïŒWebpackïŒã®ä»äºã§ããããã©ã³ã¹ãã€ã©ãŒïŒBabelïŒã®ä»äºã§ã¯ãããŸããã å€ãã®æå
¥ãã®è¡ãå±ããããã±ãŒãžã«ã¯ããã§ã«ESMãšã³ããªãã€ã³ãããããŸããããšãã°ãOPã«ãã£ãŠèšåãããReduxã®redux/es
ã§ãã
next.config.js
ïŒmodule.exports = { webpack: (config
ã§ãããè¡ãããšãæ€èšããŠããå Žåãconfig.module.rules
ã«ã¯ããã€ãã®ããšããããŸãããããã®ã«ãŒã«ã®ãããããå€æŽããå¿ èŠãããããã«èŠããŸããããããšãè¿œå ããå¿ èŠããããŸããïŒ ïŒ{ loader: 'babel-loader', include: '/Users/me/gh/guide/node_modules/next/dist/pages', options: { babelrc: false, cacheDirectory: true, sourceMaps: 'both', plugins: [Object] } }, { test: /\.js(\?[^?]*)?$/, loader: 'babel-loader', include: [ '/Users/me/gh/guide', '/Users/me/gh/guide/node_modules/next/dist/pages' ], exclude: [Function: exclude], query: { babelrc: true, cacheDirectory: true, sourceMaps: 'both', presets: [] } } ]
ææ¡ãããããåçŽãªæ§æã楜ãã¿ã«ããŠããŸãã
ç§ã«ãšã£ãŠã¯åé¡ãªãåäœããŸã
{
test: /\.js(\?[^?]*)?$/,
loader: 'babel-loader',
include: [
path.resolve(__dirname, './node_modules/next/dist/pages'),
],
query: {
cacheDirectory: true,
sourceMaps: 'both',
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-proposal-object-rest-spread']
}
},
ç§ã¯Lernaã¢ãã¬ããžããªã䜿çšããŠãã®åé¡ã«ééããåå ãäœã§ãããã«ã€ããŠé ãæ©ãŸããŠããŸããã ãšã©ãŒã¯webpackããçºçããŠãããããããŒããŒããªãããšä»¥å€ã«è©³çŽ°ãããããŸãããããã¯åœ¹ã«ç«ã¡ãŸããã ãããããããšã«ãç§ã¯ãã®githubã®åé¡ãèŠã€ããŸããïŒ
ãã®åé¡ãæ€çŽ¢ããLernaã䜿çšããŠããä»ã®äººã®ããã«ãããã«è§£æ±ºçãæ®ããŠãããŸãã
ãœãŒã¹ãdistãã£ã¬ã¯ããªã«å€æããå ±æããã±ãŒãžã®äºåå ¬éã¹ã¯ãªãããäœæãããªã³ã¯æã«distãã£ã¬ã¯ããªãæãããã«Lernaã«æ瀺ããŸãã
// package.json
"main": "dist",
"scripts": {
// I'm using the react-app preset because it's easy
"prepublish": "babel --presets react-app --plugins @babel/plugin-transform-modules-commonjs src --out-dir dist"
},
// This instructs Lerna to use dist when symlinking
"publishConfig": {
"directory": "dist"
}
ããã§ã lerna bootstrap
ãå®è¡ãããšãprepublishã¹ã¯ãªãããå®è¡ãããNextã䜿çšã§ããããã«ãœãŒã¹ããã©ã³ã¹ãã€ã«ãããŸãã
lerna
ã䜿çšããŠããå Žåã¯ã next-transpile-modulesã䜿çšããŠã·ã³ããªãã¯ãªã³ã¯ãäœæããŠãã©ã³ã¹ãã€ã«ããããšãã§ãlerna
䜿çšããæ¹æ³ã¯ãããã¥ã¡ã³ãã®äžéšã«èšèŒãããŠããŸãã
NextJsã¢ããªéã§ã³ãŒããå ±æããããšãæ€çŽ¢ããŠãã人ã®ããã«ãã¢ããªããžããªå šäœã§è€æ°ã®NextJsã¢ããªéã§Reactã³ã³ããŒãã³ããšãŠãŒãã£ãªãã£ãå ±æããããšãããšãã«@LinusUã®ãœãªã¥ãŒã·ã§ã³ãæ©èœããããšãå ±åã
// next.config.js
const aliasPathsToResolve = [
{ name: 'components', path: path.resolve(__dirname, './components') },
{ name: 'Common', path: path.resolve(__dirname, '../../common/react/') },
]
module.exports = () => {
return {
webpack(config, { defaultLoaders }) {
config.module.rules.push({
test: /\.(js|jsx)$/,
include: [path.resolve(__dirname, '../../common/react/')],
use: [defaultLoaders.babel],
})
/** Resolve aliases */
aliasPathsToResolve.forEach((module) => {
config.resolve.alias[module.name] = module.path
})
}
}
}
ãã®æçš¿ã®æç¹ã§ã¯ãææ°ããŒãžã§ã³ã®NextJã䜿çšããŠããŸãã
@ Lwdthe1ç§ã¯ããªãã®ã³ãŒããè©ŠããŸããããæåã«ãã®ãšã©ãŒãçºçããŸããïŒ
TypeError: Cannot read property 'then' of undefined
at getBaseWebpackConfig (/c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/build/webpack-config.js:85:25)
at async Promise.all (index 0)
at async HotReloader.start (/c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/server/hot-reloader.js:14:1675)
at async DevServer.prepare (/c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/server/next-dev-server.js:7:223)
at async /c2/wiz-frontend/packages/pipeline-view/node_modules/next/dist/cli/next-dev.js:22:359
ããã€ãã®èª¿æŽãè¡ããããã§çµãããŸããïŒ
const path = require("path");
const libPath = "../components/src"
const aliasPathsToResolve = [
{ name: "Common", path: path.resolve(__dirname, libPath) }
];
module.exports = {
webpack: (config, { defaultLoaders }) => {
config.module.rules.push({
test: /\.(js|jsx)$/,
include: [path.resolve(__dirname, libPath)],
use: [defaultLoaders.babel]
});
/** Resolve aliases */
aliasPathsToResolve.forEach(module => {
config.resolve.alias[module.name] = module.path;
});
return config
}
};
ããããå¥ã®ãšã©ãŒãçºçããŸããïŒ
export { default as NavBar } from "./NavBar/NavBar"
^^^^^^
SyntaxError: Unexpected token 'export'
at wrapSafe (internal/modules/cjs/loader.js:1055:16)
at Module._compile (internal/modules/cjs/loader.js:1103:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1159:10)
....
ããã¯ïŒ2850ãšïŒ883ã§ä»¥åã«çŽé¢ããããã§ãã
ãããã£ãŠãå¯äžã®è§£æ±ºçã¯æ¬¡ã®ããã«æãããŸãïŒ //github.com/martpie/next-transpile-modules#but -i-really-need-to-make-it-work-with-lerna
èãããšããã«ãããšãNext.jsããã®åé¡ã®è§£æ±ºãã©ã®ããã«èšç»ããŠããããRFCã§éããªãçºè¡šãããŸããã誰ããä»ããä¿®æ£ããå¿ èŠãããå Žåã¯ã httpsïŒ//github.com/ããnpmã«ãœãªã¥ãŒã·ã§ã³ãå ¬éããŸããzeit / next.js / pull / 10098 ïŒ
"next": "npm:@sheerun/[email protected]",
ãããŠnext.config.jsã«ç¶ããŠïŒ
babelIncludeRegexes: [/turf/],
ïŒç§ã®å Žåããã¹ãŠã®turfãã¡ã€ã«ãbabelã§ããªã³ã³ãã€ã«ããå¿ èŠããããŸããïŒ
ãã®åé¡ã¯é²å±ããŠããŸããïŒ
next.js 9.2.0ã䜿çšããŠããŸããã babelIncludeRegexes
ãªãã·ã§ã³ãæ©èœããŸãã
ãã®åé¡ã¯é²å±ããŠããŸããïŒ
next-transpile-modules
ã¯ãã®åé¡ãæ£ç¢ºã«è§£æ±ºããããšãç®çãšããŠããŸãããè©ŠããŠã¿ãŸãããïŒ
ããã«ã¡ã¯@martpie ã
ãã§ã«ç§ã®åé¡.babelrcãã¡ã€ã«ã®ç·šéã解決ããŸãã ç§ã¯ãã®åé¡ãåç §ã
THX
@martpie next-transpile-modules
ããŸãããããã§ããã¢ããªã±ãŒã·ã§ã³ããã«ãããããšããŠãããšãã«ã以äžã®ãšã©ãŒãçºçããŸãã å
±æã³ãŒãããŒã¹ã§monorepoã䜿çšããŠããŸãã '@ myapp / shared / components /componentname.js'ã®ãããªå
±æããã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ããããšããŠããŸãã nextjs 9.xãšã«ã¹ã¿ã next.config.js
ãŸãã
ãšã©ãŒ
`
ã¢ãžã¥ãŒã«ã®è§£æã«å€±æããŸããïŒäºæããªãããŒã¯ã³ïŒ12ïŒ4ïŒ
ãã®ãã¡ã€ã«ã¿ã€ããåŠçããã«ã¯ãé©åãªããŒããŒãå¿
èŠã«ãªãå ŽåããããŸããçŸåšããã®ãã¡ã€ã«ãåŠçããããã«æ§æãããŠããããŒããŒã¯ãããŸããã https://webpack.js.org/concepts#loadersãåç
§ããŠãã ãã
| const Spinner = props => {
| const renderDefaultSpinner =ïŒspinnerClassã{... others}ïŒ=>ïŒ
>>
ãã«ããšã©ãŒãçºçããŸãã
ãšã©ãŒïŒ> webpackãšã©ãŒã®ãããã«ãã«å€±æããŸãã
`
next.config.js
const withTM = require('next-transpile-modules')(['<strong i="26">@myapp</strong>']);
module.exports = withPlugins([withTM, withBundleAnalyzer], {
...
}
ç§ãééã£ãŠããããšãããã§å©ããŠãã ããã
@ raghav1086ã¬ãã§åé¡ãéãããšãã§ããŸããïŒ ;ïŒããã¯ããã«ãã人ã ã®éšé³ãé¿ããŸãã
+1
ãããžã§ã¯ãçšã«src/
ãã£ã¬ã¯ããªããããã¹ã¿ãŒã¿ãŒãã¬ãŒã ã¯ãŒã¯çšã«lib/
ããããããã€ãã®ç°ãªãnextjsã¢ããªå
šäœã§åå©çšããããã€ãã®äžè¬çãªãŠãŒãã£ãªãã£/ã©ãããŒããšã¯ã¹ããŒãããŸãïŒç§ã®åºçºç¹ïŒ
éçºãµãŒããŒãèµ·åããŠãlibãæ°ä»ããªãã lib /ã®ã³ã³ããŒãã³ãã¯ããŒããŒãééããããšã©ãŒãçºçããŸã
@ Lwdthe1ã®ãœãªã¥ãŒã·ã§ã³ã®ããªãšãŒã·ã§ã³ïŒhttps://github.com/zeit/next.js/issues/706#issuecomment-569041997ïŒã䜿çšããŠãäžèšã®ã³ã¡ã³ãã®srcãšlibã®åé¡ãä¿®æ£ããŸããã ãããaliasPathsToResolve
é
åãã«ãŒããã代ããã«ã config.resolve.modules
䜿çšããããšãé€ããŠãåºæ¬çã«åãããšã§ãã
webpack: (config, options) => {
config.resolve.modules = [
'./src/',
'./lib/',
'node_modules'
];
config.module.rules.push({
test: /\.(js|jsx)$/,
include: [path.resolve(__dirname, './lib/')],
use: [options.defaultLoaders.babel],
});
æè¿ã®lernaãnextjsãããã³babelã®å®çšçãªãœãªã¥ãŒã·ã§ã³ã¯äœã§ããïŒ
ã€ã³ããŒãããåã«ã©ã€ãã©ãªãäºåã«ãã©ã³ã¹ãã€ã«ããªãããã«ããŠããŸãããããã§ã¯ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã§å£ã«ã¶ã€ãããŸããã ãããç§ãåããªããã®ã§ãïŒ
next-transpile-modules
ãnext-babel-loader
include
ããã³exclude
ã«ãŒã«ãããããåæ Œ/äžåæ Œã«æŽæ°ããŸãã@mikestopcontinues next-transpile-modules
ã¯ãTypeScriptã䜿çšããŠããã«äœ¿çšã§ããŸããã
@calebmpetersonãš@martpie ïŒãäŒãããŸãããïŒðïŒã ãã©ã°ã«æ»ããŸããããåé¡ã¯ãµãã¢ãžã¥ãŒã«ãåç §ããæ¹æ³ããªãããšã®ããã§ãã ããšãã°ããã¿ãŒã³ '@ mono / components'ã¯ã '@ mono / components / Div'ãªã©ã®ã€ã³ããŒãããµããŒãããŸããã ãŸãããã¿ãŒã³ãšããŠã@ mono / components / Divããæå®ããŠãæ©èœããŸãã...ãã¹ãŠã®å ±æã³ã³ããŒãã³ãã«å¯ŸããŠãããå®è¡ãããããã§ã¯ãããŸããã ãŸããæ£èŠè¡šçŸçæããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŠäžèŽãã¿ãŒã³ãäœæããããšããŸããããåºåæ£èŠè¡šçŸã¯æ©èœããŸãããå éšã§ã¯æ©èœããªãäœããçºçããŠããŸãã
çæ³çã«ã¯ããã¹ãŠãåŠçããããã«ã@ monoããæå®ããpackage.jsonãåã¢ããªãäŸåãããã®ã®å¯äžã®æ£ããæ å ±æºãšããŠæ®ããŠãããããšæããŸãã åæ§ã«ããµãã¢ãžã¥ãŒã«ã«ã¢ã¯ã»ã¹ã§ããããã«ããããã ãã«ããã¹ãŠã®ã©ã€ãã©ãªã®ãã¹ãŠãã€ã³ããŒã/ãšã¯ã¹ããŒãããã€ã³ããã¯ã¹ãã¡ã€ã«ãç¶æããããšã¯é¿ããããšæããŸãã
æ¯ãè¿ã£ãŠã¿ããšã rootMode: 'upward'
ãnext-babel-loader
ã«æž¡ãæ¹æ³ãããã°ãçŸåšã®åé¡ã¯å®å
šã«è§£æ±ºã§ãããšæããŸããããããã°ãbabelããã©ã³ã¹ãã€ã«ããžãã¯ãåŠçã§ããŸãã ãã¶ãããã¯ä»ã®Nexté¢é£ã®åé¡ãéããããããŸããããåé¡ã®æ ¹æ¬ã¯Nextãwebpackãšbabelã«çµ¡ã¿åã£ãŠããéå®åã®æ¹æ³ã§ããããã§ãã 確ãã«ãNextã®è¿œå ããžãã¯ãšã¯å¥ã«babel-loader
ãæ®ãæ¹æ³ã¯ãããŸããïŒ
next-transpile-modules
ããã³ãã®æŽæ°ã§ãã ãšã©ãŒã誀蚺ããŸããã ã«ã¹ã¿ã ã®.babelrc
ãå¿
èŠãªå Žåããã®ã¡ãœããïŒã€ã³ããã¯ã¹ãŸãã¯ãµãã¢ãžã¥ãŒã«ïŒã䜿çšããã€ã³ããŒãã¯æ©èœããŸããã ã«ã¹ã¿ã èšå®ã¯ãå¿
èŠãªã³ãŒãã«é©çšãããŸããã ãããrootMode: 'upward'
åé¡ã§ãã
@mikestopcontinues .babelrc
ïŒããŒã«ã«æ§æïŒã§ã¯ãªãã next-transpile-modules
ã§babel.config.js
ïŒã°ããŒãã«æ§æïŒã䜿çšããå¿
èŠããããŸããFAQã§èª¬æãããŠããŸã;ïŒ
@martpieããªãã¯ç§ãã©ãã»ã©æ¥ããããã®ã
next-transpile-modulesã¯ç§ã®ããã«Reactãå£ããŸããã 3ã€ã®ãµã³ãã«ã¢ãžã¥ãŒã«ããã©ã³ã¹ãã€ã«ããŠãããšãã«ãç¡å¹ãªããã¯ã䜿çšããŠããããšãã¹ããŒãããŸã
誰ãããtranspilationãæ©èœãããããã®æè¯ã®æ§æãäœã§ããããç¹°ãè¿ãããšãã§ããŸããïŒ ç§ã¯babel.config.jsã«æžããªããã°ãªããªããã®ãååŸããŸãã
@masbaehrã»ãšãã©ã®å Žåãnext.configã»ããã¢ããã«next-transpile-modules
ãè¿œå ããã ãã§ã
å¯äžã®åé¡ã¯ã next-transpile-modules
ãYarn 2pnpããµããŒãããŠããªãããšã§ãã
æãåèã«ãªãã³ã¡ã³ã
next.js
ãæ¬æ Œçã«äœ¿çšãããã®åšãã«ã¢ãžã¥ãŒã«ã®è±å¯ãªã©ã€ãã©ãªãæ§ç¯ããã°ããã»ã©ããã®æ©èœã¯ããéèŠã«ãªããŸãã ããã¯ãå éšã¢ãžã¥ãŒã«ã®babelã³ã³ãã€ã«æé ãè€è£œããå®éã®PITAã«ãªãã€ã€ãããŸããðð€