CSSãå¥ã®.css
ãã¡ã€ã«ã«åå²ãããšäŸ¿å©ãªå ŽåããããŸãã ç§ã¯æ¬¡ã®ããšãããããšããŸããïŒ
pages/
âââ index
âââ index.css
âââ index.js
âââ component.js
次ã«ãindex.jsã§ã次ã®ããšãè©Šã¿ãŸããã
import css from './index.css'
ãããŠnext.config.jsã§ïŒ
module.exports = {
webpack: function (config) {
config.module.loaders = (config.module.loaders || []).concat({
test: /\.css$/, loader: 'raw'
})
return config
}
}
ããããæ®å¿µãªãããããã¯ç§ã«äžãç¶ããŸãïŒ
ERROR Failed to compile with 1 errors
This dependency was not found in node_modules:
* ./index.css
äœããã®çç±ã§é©åãªå Žæã«è§£æ±ºãããŠããªãããã§ãããããŒã«ã«ã®component.js
import component from './component.js'
çµç±ã§ãæ©èœãããããããã§äœãèµ·ãã£ãŠããã®ãããããŸããã
ããã¯ãµãŒããŒã§ã¯æ©èœããªããšããããšã§ããïŒ
ããã«å¯Ÿããåé¿çã¯ãŸã ãªããšæããŸãã cc @arunoda
ããã§ããããããæ©èœããããã«ã¯ãnext.config.jsã®webpackæ§æãäž¡åŽã§æ©èœããæ¹æ³ãå¿ èŠã ãšæããŸãã
Nextã§CSSãSASSãããŸããã¬ã€ã§ããªãããã«èŠãããšããç¹ã§ãäžçš®ã®çå Žã®ãããªåé¡ããããŸãã ããŒãžã«ã€ã³ããŒãããæšæºã®Reactã³ã³ããŒãã³ããå«ãcomponents
ãã£ã¬ã¯ããªããããŸãããSASSïŒãŸãã¯CSSïŒãã¡ã€ã«ã«ã€ã³ããŒãããããšãããšãããã®ãã¡ã€ã«ã«é©åãªããŒããŒã䜿çšããå¿
èŠããããŸãããšããã¡ãã»ãŒãžã衚瀺ãããŸãããšã©ãŒã¡ãã»ãŒãžãå
¥åããŸãã
éåžžãReactã§ã¯SASSãã¡ã€ã«ãã€ã³ããŒãããstyleãcssãsassããŒããŒã䜿çšããŠWebpackãã³ã³ãã€ã«ããŸãã ããããnext.config.js
ãã¡ã€ã«ã«è¿œå ããããšããŸããïŒãããŠNPMãããããã€ã³ã¹ããŒã«ããŸããïŒããããã§ãåããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ç§ã®next.config.js
ãã¡ã€ã«ïŒ
module.exports = {
webpack: (config, { dev }) => {
config.module.rules.push({ test: /\.scss$/, loader: ['style-loader', 'css-loader', 'sass-loader'] });
return config;
}
}
ãããã®è³ªåãã°ãããŠããããã«èãããããããããžã®çãã詳ãã説æããŠããããã¥ã¡ã³ãã§æãããªäœããèŠéããŠããå Žåã¯ç³ãèš³ãããŸããããSASSïŒãŸãã¯å°ãªããšãCSSïŒãã³ã³ããŒãã³ããŸãã¯ããŒãžã«ã€ã³ããŒã/ã³ã³ãã€ã«ããå®çšçãªäŸãããå Žåã¯ããããããŒã/ã³ã³ãã€ã«ããããã«next.config.js
ã«è¿œå ããå¿
èŠããããã®ã¯äœã§ããç§ã¯ããã倧ãã«æè¬ããŸãã ããããšãïŒ
ç§ã¯css-modules-require-hookã䜿çšããŠã
cssãæ©èœãããããã
@spacedragon css-modules-require-hookãNext.jsãšçµ±åããæ¹æ³ã®äŸã¯ãããŸããïŒ åäœãããã®ã«åé¡ããããŸãã
誰ãããããè¡ãæ¹æ³ã«å ãåœãŠãããNextå ã«CSSãã¡ã€ã«ãã€ã³ããŒããããããããšãã§ããã°ïŒã³ãŒãäŸãä»ããŠïŒãSASSãã³ã³ãã€ã«ããã®ã«ãŸã åé¡ããããŸãã
èå³æ·±ãããšã«ãREADMEãã¡ã€ã«ãæŽæ°ãããŠSVGããŒããŒã®äŸãåé€ãããSVGãCSSãSASSãªã©ã®ãã¡ã€ã«ã«ããŒããŒãè¿œå ããããšã¯ãå§ãããŸããã ã€ã³ã©ã€ã³CSSãåé¡ãªãçç±ã¯ããããŸããããã€ã³ããŒããããCSSã¯åé¡ãããŸããããããã«ã¯ååãªçç±ããããšç¢ºä¿¡ããŠããŸãã ç§ã¯çŸåšãJSã§å®çŸ©ãããŠããªã/ã€ã³ã©ã€ã³åãããCSSãšSASSãåŠçããªãããã®æè¯ã®æŠç¥ã«ã€ããŠç¢ºä¿¡ãæãŠãŸããã
@ MikeDigitize ïŒ627ããã³ïŒ638ã®
ãµãŒããŒåŽã§ã¹ã¿ã€ã«ãåŠçããããšã¯å®éã«ã¯å¯èœã§ãããéåžžã«ç°¡åã§ãã
ããŒãã«çŽæ¥ïŒ
require.extensions['.css'] = function(file) {
console.log(file.id)
return;
}
ããã«ã¬ãžã¹ã¿ãŒçµç±ïŒ
// from https://babeljs.io/docs/core-packages/babel-register/
require("babel-register")({
// Optional ignore regex - if any filenames **do** match this regex then they
// aren't compiled.
ignore: /regex/,
// Ignore can also be specified as a function.
ignore: function(filename) {
if (filename === '/path/to/es6-file.js') {
return false;
} else {
return true;
}
},
// Optional only regex - if any filenames **don't** match this regex then they
// aren't compiled
only: /my_es6_folder/,
// Setting this will remove the currently hooked extensions of .es6, `.es`, `.jsx`
// and .js so you'll have to add them back if you want them to be used again.
extensions: [".es6", ".es", ".jsx", ".js"]
});
webpackããŒããŒçµç±ïŒ
ãµãŒããŒã§ã®ã¬ã³ããªã³ã°äžã«éèŠãªCSSãã€ã³ã©ã€ã³åã§ãããããç§ã¯å人çã«å圢ã¹ã¿ã€ã«ããŒããŒã䜿çšããŠããŸãã ããããªããŒãããã®ä»ã®DXé¢é£ã®ãã®ãæ©èœããŸãã ãµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã®äœ¿çšãè€éã«ãªããCSSããCãåé€ããããããç§ã¯JSã®CSSãããŸã奜ãã§ã¯ãããŸããã
@viktorbezdek next.jsã§isomorphic-style-loaderãæ£åžžã«äœ¿çšããŸãããïŒ
@noeljacksonããã§ã¯ãããŸããããããããã€ããã§ãã Next.jsã¯ææã«èŠãããããæ©èœããããšå€ãã®æéãç¯çŽã§ããŸãã 次ã®1ã2é±éã§èª¿æ»ããæåããå Žåã¯ãã«ãªã¯ãšã¹ããéä¿¡ããŸãã
@viktorbezdekããã¯ç§ãåãçµãã§ãããããžã§ã¯ãã«ãšã£ãŠéåžžã«éèŠãªã®ã§ãããã«è³éããããŸãã ç§ã¯èªåãç¡èœã§ã¯ãªãããšãç¥ã£ãŠããŸããããããç解ããã®ã«ååãªããã«å€æããããã°ããæ¹æ³ãç解ããŠããŸããã ç§ã¯ãããã®ã¢ã€ãã¢ã®é åãè©ŠããŸãããã100ïŒ æ©èœãããã®ã¯ãããŸããã ç§ã¯ãbabel-plugin-webpack-loadersã䜿çšããŠãraw-loaderã«ããŒã¿ãšã³ã³ãŒããããã¹ã¿ã€ã«ã·ãŒãããã«ãããããšãã§ããŸããããã©ã®ã¹ã¿ã€ã«ããŒããŒãæ©èœããŸããã ãã£ã€ã ããŠãããŠããããšãïŒ ïŒïŒ 倧å€æè¬ããããŸãã
ããã«å¯Ÿãã解決çã¯ãããŸããïŒ ç§ã¯è§£æ±ºçãèŠããã®ã§ãcssãã°ããŒãã«ã«å«ããå¿ èŠã¯ãããŸããã
FWIWãCSSãã¡ã€ã«ã/static
ãã©ã«ããŒã«çœ®ããŠããŸãã çŽ æŽãããã³ãã±ãŒã·ã§ã³ã§ã¯ãããŸãããã倧ããããšã§ããããŸããã
解決çããããŸãã ç§ã¯ããããªããšãçµããããšãã§ããŸããã§ããã ç§ã¯ããŒã«ã«ã§æåã®ãããã¿ã€ããäœæããŸããããããã¯æ©èœããŠããããã§ãããå®äºãããŸã§ã«æ°æéããããŸãã ç§ã¯é±æ«ã®åŸã«çµãããšããªã確信ããŠããŸãã ä¹ããæåŸ ã
@matthewmueller CSSã¢ãžã¥ãŒã«ã䜿çšããŠããŸããïŒ
@viktorbezdekããã«åãçµãã§ãããŠããããšãïŒ CSSã¢ãžã¥ãŒã«ã®ãµããŒãïŒãŸãã¯åæ§ã®ãã®ïŒã¯ããã®ãããžã§ã¯ãIMOã«ãšã£ãŠéèŠã§ãã ã¹ã¿ã€ã«ä»ãjsxã¯ãåçŽãªç¶æ³ã§ã¯åé¡ãããŸããããã¹ã¿ã€ã«ã®å€ãã³ã³ããŒãã³ãã§ã¯èªã¿ã«ããã§ãã
ãã®ãããªbabelãã©ã°ã€ã³ã¯ãªãã·ã§ã³ã«ãªããŸããïŒãµãŒããŒåŽãïŒïŒ https://github.com/gajus/babel-plugin-react-css-modules
ç§ã¯ãããæ©èœãããããšããŸããããéããããŸããïŒ/
ç§ã¯CSSã¢ãžã¥ãŒã«ãbabel-plugin-css-modules-transform
ã ç§ã®ãã©ãŒã¯ã§ç§ã®ããããŒãªäŸãåç
§ããŠãã ããã
æ¬ ç¹ã¯ãCSSã«å€æŽãå ãããã³ã«ããµãŒããŒã匷å¶çµäºããŠåèµ·åããå¿ èŠãããããšã§ãã
äžéšã®Reactã³ã³ããŒãã³ãã¯ã import
éçãªãœãŒã¹ãä»ããŠããã©ã«ãã®ã¹ã¿ã€ã«ãå
¬éããŸãã ããšãã°ã https ïŒ
import 'rc-slider/assets/index.css';
ãã®ã¹ã¿ã€ã«ã·ãŒããstatic/
ãã£ã¬ã¯ããªã«ã³ããŒããŠè²Œãä»ããããšã¯ç¢ºãã«å¯èœã§ãããå°æ¥ã®ã³ã³ããŒãã³ãã®æŽæ°æã«ã¢ããã¹ããªãŒã ã¹ã¿ã€ã«ãšåæãç¶ããããšã¯ãªãããã®ã³ã³ããŒãã³ãã®ããã¥ã¡ã³ãã§æšå¥šãããŠãããã®ãšäžèŽããŸããã
åé¡ã¯ããããã®CSSãã¡ã€ã«ãã°ããŒãã«ãªå¹æãããããããšã§ãã CSSã_ãã£ããã£_ããReactã©ã€ããµã€ã¯ã«å ã«é 眮ããŠãããŠã³ã解é€ããµãŒããŒã¬ã³ããªã³ã°ãªã©ãè¡ãããšãã§ããå¿ èŠããããŸãã
å€ãã®å³æžé€šãããããŠããŸãããããã¯è¯ããã¿ãŒã³ã§ã¯ãªããšæããŸãã
Zeit Nextã®å
éšã«ç²ŸéããŠããŸãããã import
éçåæã䜿çšããŠCSSãç»é²/ãã£ããã£ã§ããŸããïŒ
ã§ããŸããããããã¯æ¬åœã«å¥åŠãªããšã§ãã render()
ã®å€åŽã«ãããã®ãšåæ§ã«ãã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«å
ã«éæ³ã®ããã«æ¿å
¥ãããŸãã
//ãããä»ã®äººãšå ±æããããšæã£ã
ãããš...ããã§CSSãããã¯ããã®ã«å°ãæéãããããããŸããããïŒç§ã«ãšã£ãŠã¯ïŒæ©èœãããœãªã¥ãŒã·ã§ã³ã«ãã©ãçããŸããã 確ãã«ãããã¯ããã¯ã§ãããããããªããŒãã¯æ©èœãããµãŒããŒåŽã®æ§ç¯ãæ©èœããŸãã
ïŒ_shudder_ïŒgulpã䜿çšãããã®gulpfileïŒhttps://gist.github.com/auser/25e88e39d83413773c01f4c000ec2806ïŒã§ããã¹ãŠã®**/*.scss
ãã¡ã€ã«ãé£çµããã Styles
ã³ã³ããŒãã³ãã«æŒã蟌ãŸããŸãã ãéåžžã®ãèŠçŽ ãšããŠã®ããŒãžã
次ã®çã®postcssãµããŒããåŸããããŸã§ããããä»ã®èª°ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
@auserãããã¯ããŠãããŠããããšããç§ã¯éãæªãã£ãã®ã§äžæ¥äžwebpackã®èšå®ãèŠãŠããŸããïŒ
ç·šéïŒ
ãšããã§ãgulpfileã«sassããŒãµãŒãè¿œå ããå¿
èŠããããŸãïŒ
ã¯ããããã...çŽç²ãªcssãã¡ã€ã«ãã³ã³ãã€ã«æžã¿ã®ãã¡ã€ã«ãšåºå¥ããæ¹æ³ãšããŠ.scss
æ¡åŒµåã䜿çšããŸãã postcssïŒ precss
ïŒã¯sassãååã«æš¡å£ããŠããã®ã§ãç§ã¯ãããæã£ãŠããŸããã sassããŒãµãŒã䜿çšããŠèªç±ã«ç·šéããŠãã ããã
gulpã䜿çšããŠcssãã¡ã€ã«ãã³ã³ãã€ã«ããã€ã³ã©ã€ã³ã§ãã«ãããããããããªããŒãããªããŠãããŸããªãå Žåã¯/ staticã§ãã«ãããã®ããçŸåšã®ãšããæåã®è§£æ±ºçã®ããã§ãã
ç§ã¯cssã€ã³ããŒã+ããããªããŒãããããã«æ©èœããããã«ãªããŸããã cssã¯æååãšããŠã€ã³ããŒãããããŠãŒã¶ãŒã¯ä»ã®æååãšåãããã«ããŒãžã«ã€ã³ã©ã€ã³åã§ããŸãã ãã®äŸãèŠãŠãã ãããç§ããã¹ãããã®ãæäŒã£ãŠãã ããããããŠPRã¯å€§æè¿ã§ãïŒ
https://github.com/davibe/next.js-css-global-style-test
ãã®äŸã¯next.jsã®å ¬åŒäŸã«ãªãã¯ãã ãšæããŸãã ããã§ããïŒ @rauchg @arunoda @nkzawa ïŒçŽæ¥é¢ä¿ã®ãªã人ã«ã¿ã°ãä»ãããããããªããïŒ
@davibeãã¢ãšbabel-plugin-wrap-in-jsã«æè¬ããŸã
ãã®äŸã§ã¯ãCSSãã¡ã€ã«ãšSCSSãã¡ã€ã«ã®äœ¿çšã確èªããŠããŸãã ãããpostcssãšcssnextã§æ©èœãããã©ããç¥ã£ãŠããŸããïŒ
@ khrome83çç±ã¯ããããŸãããã.babelrcãšnext.config.jsã調æŽããã ãã®åé¡ã ãšæããŸã
@davibeæ§æã«åºã¥ããŠã¢ããªããããã€ã§ããªãã£ãããšãããããŸããã ãã«ãã¯.babelrc
ãã¡ã€ã«ã®next/babel
ãèªã¿åãããšãã§ããŸããã§ããã ç§ã¯åé¡ãæåºããŸããããããããã¹ãŠãã解決çãçãŸããããšãæ¬åœã«æãã§ããŸãã 容æãã®æ¬ èœimport file.css
ããcreate-react-app
ãç§ã¯æ¥ãœãªã¥ãŒã·ã§ã³ãååšããå¿
èŠããããŸãç¥ã£ãŠãã:)
ç§ãæã解決çã¯ããããã次ã®ãããªãã®ã§ãã
https://github.com/zeit/styled-jsx/pull/100#issuecomment -277133969
ç§ãã¡ã¯ãã€ã³ããŒãããµããŒããããããããŸãã.css
ïŒãšåæ§ã«ãæã
ããµããŒãããŠãããããããŸããïŒèŒžåºæååãããããšåã«ã¢ãžã¥ãŒã«ã«ãããtranspilingã«ãã£ãŠïŒ .svg
çŽç²ã«ãããtranspilingããšã«ãããã³ã³ããŒãã³ãåå¿ããŸãïŒ
åæ§ã«ã.svgãçŽç²ãªreactã³ã³ããŒãã³ãã«ãã©ã³ã¹ãã€ã«ããããšã§ãµããŒãããããšãã§ããŸã
ããã¯éåžžã«åçŽãªããªãã¯ã§ãã å¥ã®ãããžã§ã¯ãã§ãããã©ã®ããã«åŠçãããã瀺ãåºæ¬çãªäŸãäœæããŸã=ïŒ
ç·šéïŒ https ïŒ ãã ãã
@davibeãµã³ãã«ã«åºã¥ããŠã httpsïŒ//github.com/moxystudio/next.js-style-loaderãäœæããŸããstyle-loader
ã«äŒŒãŠããŸãã SSRããµããŒãããŠããŸãã
css-loader
ïŒcssã¢ãžã¥ãŒã«ãããšãªãïŒã postcss-loader
ã sass-loader
ãªã©ã§ããŸãæ©èœããŸãã css-loaderã䜿çšããå Žåããã®url
ãªãã·ã§ã³ãfalse
èšå®ããå¿
èŠãããããšã«æ³šæããŠãã ãããnext.jsã®ç»åããã©ã³ããªã©ã¯/static
å¿
èŠããããŸãã ãã®ãã¹ãŠã®æ
å ±ã¯READMEã«ãããŸãã
楜ããã§ããã£ãŒãããã¯ããã ããïŒ
ã¬ããããããšãïŒ ããã¯cssãã¡ã€ã«ãã€ã³ããŒãããããã«åããŸããã blueprintjsãè©ŠããŠããŸãããcssãæ£ããèªã¿èŸŒãŸããŠããããã§ãã ãã ããcssã«å«ãŸããŠãã@ font-faceã«ãŒã«ã¯æ©èœããŠããªãããã§ãã ïŒ
--------------------ç·šé----------------------
ããã¯å®éã«æ©èœããŠããŸããç§ã®æªãã§ãïŒ
ãã ããnextjsã«ãŒãã£ã³ã°ã§ã¯ããã©ã«ãã§/ static /ã®å€éšã«éçã³ã³ãã³ããæäŸã§ãããçžå¯Ÿãã¹ã«ãã£ãŠå®éã«ã¯èš±å¯ãããŠããªããã¹ã§ããŒãããããããã¢ã€ã³ã³ã¯ããŒããããŸããã
@pencilcheckã¯ãã/ staticãæããã¹ã䜿çšããå¿ èŠããããŸãããããããREADMEã§ãããããæ確ã«ããŸãã
fonts atmãªã©ã®cssãã¡ã€ã«ã«å«ãŸããçžå¯Ÿãã¹ã«é¢ããåé¿çã¯ãããŸããïŒ ãŸãã¯ããã©ã³ããã¡ã€ã«ãšcsså šäœãéçãã©ã«ããŒã«ã³ããŒããã ãã§æ©èœããŸããïŒ
@pencilcheckCSSãã¡ã€ã«ã¯éçãªç¯å²å€ã«ãšã©ãŸãããšãã§ããŸãã ç»åãšãã©ã³ãã¯éçãªå
éšã«ããå¿
èŠãããã /static/file
åç
§ããŸãã
ããã£ãã ãã ããnpmããã±ãŒãžã§ãããã«ãŒããªã³ãã䜿çšããŠããã®ã§ãnode_moduleså ã®ãã¡ã€ã«ãå€æŽããå¿ èŠããªãããã«ããããšæããŸãã
@pencilcheckæ®å¿µãªããããã¯äžå¯èœã§ãã next.jsã¯ãç»åããã®ä»ã®ã¢ã»ããã®åŠçæ¹æ³ãéåžžã«å³å¯ã§ãã ãã®äŒè©±ãæ±ããªãããã«ããŸããããå¯èœã§ããã°ãnext-style-loaderãªããžããªã§åé¡ãäœæããŠãã ããã
@tgoldenbergåé¡ããããã説æã§ããŸããããããšãåçŸæ¹æ³ãæããŠãã ããã ç§ã®ãªããžããªãåç §ããŠãã ããã ããã§åé¡ã远跡ããæ¹ãç°¡åã§ãã
@davibe ã yarn
è¶
ããnpm install
yarn
ã䜿çšãããšåé¡ãçºçããŸããã ã€ãŒã³ã¯ããã€ãã®äžå¯è§£ãªãšã©ãŒãã¹ããŒããŠããŸããããç§ããããåé€ãããšãäŸã¯æ¬çªç°å¢ã§æ£åžžã«æ©èœããŸããã
ç§ã¯ãããèšå®ããã®ã«4æéè²»ãããã ãã§ãæéãç¯çŽããããšæã£ãŠãã人ã«ãšã£ãŠã¯èå³æ·±ããããããªããšæããŸããã ïŒçŸåšã®äŸã®ããã«ïŒå€æŽæã«ã¹ã¿ã€ã«ãèªåçã«é©çšããPostCSSãä»ããŠCSSãå®è¡ãã css-loader
ããããŒã«ã«ã¢ãžã¥ãŒã«åãæäŸããŸãã åŸè
ã®æ¬ åŠã¯ããã°ããŒãã«cssã/ãcssã€ã³ããŒããã®äŸã®çŸåšã®ç¶æ
ã§ç§ã«ãšã£ãŠå€§ããªååŒãã¬ãŒã«ãŒã§ããã
component.js
import React from 'react';
import stylesheet from './styles.css';
const [css, className] = stylesheet;
const Component = () => (
<p className={className.paragraph}>
<Head><style dangerouslySetInnerHTML={{__html: css}} /></Head>
bazinga
</p>
);
.babelrc
{
"presets": [
"next/babel"
],
"plugins": [
["wrap-in-js", {
"extensions": ["css$"]
}]
]
}
next.config.js
exports-loader
é©ãã¹ãããã¯ã«æ³šç®ããŠãã ããã 確ãã«ããã£ãšè¯ãæ¹æ³ãå¿
èŠã§ããïŒ
module.exports = {
webpack: (config) => {
config.module.rules.push(
{
test: /\.css$/,
use: [
{
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]'
}
},
{
loader: 'raw-loader'
},
{
loader: 'val-loader'
},
{
loader: 'exports-loader',
options: {
0: 'exports[0][1]',
1: 'exports.locals'
}
},
{
loader: 'css-loader',
options: {
modules: true,
minimize: true
}
},
{
loader: 'postcss-loader'
}
]
}
);
return config;
}
};
ç§ã¯èªåã§è§£æ±ºçãæãã€ããŸãããããã¯ã @ satazorãã¹ã¬ããã®äžäœã«æçš¿ãããã®ãšéåžžã«ãã䌌ãŠããŸãïŒ https ïŒ
next.config.js
æ°è¡è¿œå ããã ãã§ãïŒ
module.exports = {
webpack: config => {
config.module.rules.push({
test: /\.css$/,
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]',
}
}, {
test: /\.css$/,
loader: 'babel-loader!next-css-json-loader',
});
return config;
},
};
ã¹ã¿ã€ã«ã¯jsãªããžã§ã¯ããšããŠã€ã³ããŒããããããã glamor
ãåæ§ã®ãœãªã¥ãŒã·ã§ã³ã§éåžžã«ç°¡åã«äœ¿çšã§ããŸãã
// .css files now conveniently expose all styles as js objects
import styles from 'some-package/styles.css';
import { css } from 'glamor';
// ...
<div {...css(styles)}>
this is a nice box.
</div>
也æ¯ïŒ ð»:)
ããŒã¯ããŠã³ãã¡ã€ã«ãæååãšããŠã€ã³ããŒãããããã«ãããæ©èœãããæ¹æ³ã¯ãããŸããïŒ çŸåšraw-loaderã䜿çšããŠããŸãããwebpackãã©ã°ã€ã³ã§ããããããµãŒããŒã§ã¯æ©èœããŸããã
@kristojorg
ããŒã¯ããŠã³ã€ã³ããŒãçšã®babelãã©ã°ã€ã³ãäœæããŸããã ä»ã¯ç§ã®æºåž¯é»è©±ã«ãããŸãããç§ã®GitHubãèŠããšè¡šç€ºãããŸãã
@ khrome83ããã¯çŽ æŽãããã§ããã è©ŠããŠã¿ãã®ã楜ãã¿ã«ããŠããŸã
ããããšã@ khrome83ïŒ è©ŠããŠã¿ãŸã
ç§ã¯ãããæ¬åœã«è¿ éã«è¡ããªããã°ãªããªãã£ãã®ã§ãreadmeãæŽæ°ããŸããã§ããã ããããããªãã¯ãããbabelãã©ã°ã€ã³ãšããŠå«ããŠãã䜿çšããŸã
'File.md'ãããã¡ã€ã«ãã€ã³ããŒãããŸãã
ç§ã¯ãããåãããŸãããããããšãïŒ éåžžã«åœ¹ç«ã¡ãŸã
ããã¯ãªããããã¯ã§ãããåé¡ã¯ã¯ããŒãºãããŠããã®ã§ãèªç±ã«è©³ãã説æããŸã:)
ããŒã¯ããŠã³ã«ã€ããŠã¯ã2ã€ã®ããšãã§ããŸãã
ïŒ1ïŒ
1ã€ã¯ãããŒã¯ããŠã³ãã¡ã€ã«ãæååãšããŠå«ããå®è¡æã«html / reactã«å€æããããšã§ãã ããã¯ãcssã®next.jsã®äŸexamples/with-globa-stylesheet/.babelrc
ã§äœ¿çšãããŠããã®ãšåãããã«ãããŒã¯ããŠã³ãã¡ã€ã«æ¡åŒµåã«ç»é²ããæ±çšã®wrap-in-js
babelããŒããŒã䜿çšããŠè¡ãããšãã§ããŸãã
ïŒ2ïŒ
ããªããã§ããããäžã€ã®ããšã¯ãmarkdown -in-jsã䜿çšããŠå€ææã«ããŒã¯ããŠã³ãå€æããããšã§ã
ããŒã¯ããŠã³ããã¥ã¡ã³ãã¯ãã§ã«äºåã«ã¬ã³ããªã³ã°ãããŠãããããå®è¡æã«é«éã«ãªããŸãïŒjsãå®è¡ããã ããªã®ã§ïŒãããã¯äžéšã®ã·ããªãªã§ã¯ããèå³æ·±ãå ŽåããããŸãã ãŸããã©ã€ãã©ãªã䜿çšãããšãã«ã¹ã¿ã Reactã³ã³ããŒãã³ããæ¿å
¥ã§ããŸãã æ®å¿µãªããããã®ãããªå Žåã«ã¯ãããªãã®äžã«ããŒã¯ããŠã³ã€ã³ã©ã€ã³ã§èšè¿°ããå¿
èŠãsource.js
ã®ããã«ã
ïŒ2ïŒãéžæããå Žåãmarkdown-in-jsæ§æã®ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããæäŸããã¢ãã ãã©ã°ã€ã³ããããããã¯language-markdown-in-js
ãšåŒã°ããŸãã
@davibeãã³ãããããšãããããŸãïŒ ããŒã¯ããŠã³ããã«ãæéãšããŠè§£æãããã®ã§ãããmarkdown-in-jsã§çºçããå¯äžã®åé¡ã¯ãäœæäžã«ããã¯ãã£ãã¯ããšã¹ã±ãŒãããããšã§ã:(ããã¶ããbabelã䜿çšããŠæååãšããŠã€ã³ããŒããããããmarkdown-in-jsã«ãã£ãŒãããå¿ èŠããããŸãã ïŒ
@kristojorg
圌女ã®ããŒã¯ããŠã³ã¬ã³ããªã³ã°ããããŸãã ãã©ã°ã€ã³ãæžããçç±ãåãã§ãã ããŒã¯ããŠã³ãæååãšããŠãã«ãããããreact-markdownã§å®è¡ããŸãã ãã¹ãŠã®ãªã¹ããåŠçããListã³ã³ããŒãã³ãã®ããã«ãreactã³ã³ããŒãã³ããæž¡ããŠããŒã¯ããŠã³ã¬ã³ããªã³ã°ããŒã¹ãè¡šãããšãã§ãããããããã¯ãŸããŸãããŸãæ©èœããŸãã StyledJSXã§ããŸãæ©èœããŸãã
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ äžèšã®ã³ã¡ã³ããããçŸåšã®ãšããå®ç§ãªè§£æ±ºçã¯ãŸã ãªãããšãããããŸãã
@arunoda
isomorphic-style-loaderã䜿çšããäŸãäœæããããšã¯å¯èœã§ããïŒhttpsïŒ//www.npmjs.com/package/isomorphic-style-loaderïŒ
ããã¯å®ç§ã§ãããïŒ
npmããã±ãŒãžããreactã³ã³ããŒãã³ããã€ã³ããŒããã次ã«.cssãŸãã¯.scssãã¡ã€ã«ãã€ã³ããŒãããå Žåã®è§£æ±ºçã¯ãããŸããïŒ ã€ãŸããåºæ¬çã«node_modulesããã€ã³ããŒãããããã¡ã€ã«ããã©ã³ã¹ãã€ã«ããŸã
ç§ã¯Create-React-AppïŒCRAïŒãæ°é±é䜿çšããŠããŸãããä»æ¥Next.jsã«åºããããŸãããçŸåšãCRAããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒããµããŒãããŠããªããããéåžžã«è奮ããŠããŸãã
ç®±ããåºããŠSSRããµããŒãããããã«Next.jsã«åãæ¿ãããã®ã§ããã .scss
ãã¡ã€ã«ãã€ã³ããŒãã§ããªãã®ã§å°ã£ãŠããŸãã
SASSããŒããŒãWebpackæ§æã«è¿œå ããæ¹æ³ãèŠã€ãã人ã¯ããŸããïŒ
cr101ã«åæããŸããããCSS / SASSããµããŒããããŠããªããšããããšã¯ãç§ã«ãšã£ãŠãªãã·ã§ã³ã§ã¯ãªãFoundationã®ãããªcssãã¬ãŒã ã¯ãŒã¯ãç Žæ£ããå¿ èŠãããããšãæå³ããŸãã
ç§ã¯@davibeã«ãã£ãŠæäŸããããªããžããªã䜿çšããŠãã¯åœŒãæã£ãŠãããœãªã¥ãŒã·ã§ã³ã§å£ããŠããŸãã
誰ããããã«å¯Ÿããä¿®æ£ãèŠã€ãããã倧奜ãã§ãã ã»ãã¥ãªãã£ãã°ã®ããã2.4.1ãžã®ã¢ããããŒãã¯çµ¶å¯Ÿã«å¿ èŠã ã£ãã®ã§ãå ã«æ»ãããšã¯ã§ããŸããã
@Yuripetusko @ CR101 @tgoldenberg絶察ã«åæãããã®ãšããŸãã æ£çŽãªãšããã次ã¯ç®±ããåºããŠäœæ¥ã§ããã®ã¯æ¬åœã«çŽ æŽããããšæããŸãã ããŒãã³ãŒããããæ§é ïŒå¿
é ã®/pages
ãã£ã¬ã¯ããªã /static
ãªã©ïŒã§ããã¹ãŠåé¡ãã/pages
ã ããããå®å
šã«ãµããŒããããŠããªãscss
ã¢ãžã¥ãŒã«ã¯ãç§ãã¡ã«ãšã£ãŠãã¹ãŠãå£ããŸãã éåžžã«è€éãªscss
æ§é ããããèªåãã¬ãŒã¯ãã€ã³ããšãã¹ãŠã®ã¢ã¹ãã¯ãæ¯ã®åèšç®ããããŸãã æ§é ãå®ç§ã«ããããã«äžçæžåœåããŸããã 次ã¯çŽ æŽãããã§ããç§ãã¡ãçŸåšæã£ãŠãããã¹ãŠã®scss
ãã®ãæšãŠãããšã¯ã§ããªãããã§ãã ãµããŒããããŠããªãscss
ã¯ããã®çŸããããŒã«ãžã®ç§»è¡ã劚ããå¯äžã®ããããæãéèŠãªããšã§ãã
å®éãïŒ1615-ããã€ãã®ã¢ã¯ã·ã§ã³ãé²è¡äžã§ãã @timmywilã¯ã next
åäœããããã«isomorphic-style-loader
ãèšå®ããããšããŠããŸãã èå³ã®ããæ¹ã¯ã©ãªãã§ããåå ããã ããŸãã
ç§ã¯ãã®ã¹ã¬ãããæããŠãããã¹ãŠã®è§£æ±ºçãè©ŠããŸãããããããã®ãããããæ©èœãããããšãã§ããŸããã ã ããç§ã¯èªåã§è©ŠããŠã¿ãããšã«ããŸããããããŠç§ã¯ãããããã«ææžåã
@almeynmanããããšãããããŸãïŒ ééããªãããªãã®ã¢ãããŒãã§èŠãã€ããã§ãïŒ
ã¡ãªã¿ã«ããã®äŸã«åŸãããšã§ã scss
ã¢ãžã¥ãŒã«ãæ©èœãããããšãã§ããŸããã ç§ãè¡ã£ãã®ã¯ã sass-loader
ãšæå¹ãªãœãŒã¹ããããè¿œå ããããšã ãã§ãã
ç§ã¯ãã®æ¹æ³ã§next.js
CSSïŒSCSSã§ããïŒããµããŒãããããšã«æåããŸããã
ãŸãã next.config.js
ãæå®ãããããŒããŒãšDefintPlugin
ã€ã³ã¹ã¿ã³ã¹ãè¿œå ããŠãwebpackã®èšå®ã埮調æŽããŸãã
const webpack = require('webpack');
module.exports = {
webpack: (config, {dev}) => {
config.module.rules.push({
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader'
],
exclude: /node_modules/,
});
config.plugins.push(
new webpack.DefinePlugin({
"process.env": {
// flag to indicate this is for browser-side
BROWSER: JSON.stringify(true),
}
})
);
return config;
}
};
次ã«ãã³ã³ããŒãã³ãã³ãŒãã§ãæ¡ä»¶ä»ãã®ã¹ã¿ã€ã«ãã¡ã€ã«ãèŠæ±ããŸãã ããã«ããããã©ãŠã¶åŽã®ãã³ãã«ã®ã¿ã«ã¹ã¿ã€ã«ã¢ãžã¥ãŒã«ãå«ãŸããããã«ãªããŸãã
if (process.env.BROWSER) {
require("./style.scss");
}
if (process.env.BROWSER)
æ°ã«ããªãã®ã§ããã°ãããã¯å®ç§ã«æ©èœããŸãã
è¯ãã¢ãããŒãã¯ããã«ãã
@almeynman IMOã¯ããã®ããŒãžã«é¢é£ããCSSã¹ã¿ã€ã«ã ããããŒãããã®ã§ã¯ãªãããã¹ãŠã®ããŒãžã§Webãµã€ãå
šäœã®CSSã³ãŒããããŒããããããããŸãè¯ãã¢ãããŒãã§ã¯ãããŸããã
Webãµã€ãå
šäœã®CSSã§ã¯ãªãå¿
èŠãª.scssãã¡ã€ã«ã®ã¿ãã€ã³ããŒããããšãå¿
èŠãªCSSã³ãŒããããŒãããã ãã§ãããŒãžã®ãµã€ãºã倧å¹
ã«åæžãããŸãã
@ cr101ããã«ã¡ã¯ãç§ã¯ãããç¥ããŸããã§ããã ç§ã¯å®éã«ã¯ãã®èšå®ã䜿çšããŠããŸãããä»ã®äººã®åèã®ããã«æçš¿ããã ãã§ãïŒç§ã¯ãããè¯ããšæããŸãã...ïŒã ç§ã¯ãŸã ããã°æçš¿ã§èª¬æãããŠ
誰ããèå³ãæã£ãŠãããªããããå€ãã®äŸãšè°è«ïŒ
https://github.com/iaincollins/nextjs-starter
https://github.com/zeit/next.js/issues/2534
https://github.com/zeit/next.js/tree/v3-beta/examples/with-global-stylesheet
äžèšãšãã®ã¹ã¬ããã«åºã¥ããŠãPostCSSã䜿çšããŠä»¥äžãå€æããããšãã§ããŸããã
/static/styles/app.css
åäžã®CSSãã¡ã€ã«ã«å€æããŠæ¬çªç°å¢ã§æäŸããããããªããŒãã¯åŒãç¶ãæ©èœããŸãã styled-jsx
ã®äœ¿çšæ³ã«æ³šæããŠãã ããããã ãã <style dangerouslySetInnerHTML={} />
ã䜿çšããããšã«ããã䜿çšããã«å®è¡ã§ããŸãã
module.exports = {
plugins: [
require("postcss-easy-import")({ prefix: "_" }), // keep this first
require("postcss-url")({ url: "inline" })
]
};
ããããªããŒãã®ããã«éçºã¢ãŒãã§.scssãå€æããprodã§åäžã®.cssãã¡ã€ã«ã«æœåºããããŒããŒã ããã«ããbuild/app.css
ãããã®ã§ãæ¬çªãã«ãã§ã¯ã next build
åŸã«cp build/app.css static/styles/app.css
ãè¿œå ããŠãéçãšã¯ã¹ããŒãã§äœ¿çšã§ããããã«ãã以äžã«ç€ºãããã«ã«ã¹ã¿ã ããããŒã«åã蟌ã¿ãŸãã
const ExtractTextPlugin = require('extract-text-webpack-plugin');
export default {
webpack: (config, { dev }) => ({
...config,
module: {
...config.module,
rules: [
...config.module.rules,
{
test: /\.(css|scss)/,
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]'
}
},
...(dev
? [
{
test: /\.css$/,
use: ['raw-loader', 'postcss-loader']
},
{
test: /\.s(a|c)ss$/,
use: [
'raw-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
{
loader: 'sass-loader',
options: {
sourceMap: true
}
}
]
}
]
: [
{
test: /\.(css|scss)/,
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
importLoaders: 2,
modules: false,
url: true,
minimize: true,
localIdentName: '[hash:base64:5]'
}
},
{
loader: 'postcss-loader'
},
{
loader: 'sass-loader'
}
]
})
}
]),
{
test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
loader: 'url-loader?limit=100000&&name=[name].[ext]?[hash:8]'
}
]
},
plugins: [
...config.plugins,
...(dev ? [] : [new ExtractTextPlugin('app.css')])
]
}),
};
const inlineCSS =
process.env.NODE_ENV !== ENV_PRODUCTION && require('styles/index.scss');
...
<Head>
{inlineCSS && <style jsx global> {__html: inlineCSS} </style>}
{process.env.NODE_ENV === ENV_PRODUCTION &&
<link
rel="stylesheet"
type="text/css"
href={`/static/styles/app.css?${this.props
.__NEXT_DATA__.buildId}`}
/>}
</Head>
ã圹ã«ç«ãŠãã°ã ããã«è©³ãã説æãå¿ èŠãªå Žåã¯ãç¥ãããã ããã ããå€ãã®ãœãªã¥ãŒã·ã§ã³ã楜ãã¿ã«ããŠããŸãã ããŸãããã°ãããã¯ãŸã ããªãããªãããŒã§æéã®ãããçµ±åãªã®ã§ã誰ããæçµçã«è¯ããã©ã°ã€ã³ãæãä»ãããšãã§ããŸãã
ãã¹ãŠã®.scss
ãã¡ã€ã«ãåäžã®CSSãã¡ã€ã«ã«æœåºãã代ããã«ãã€ã³ããŒããããå.scss
ãã¡ã€ã«ãç¬èªã®CSSãã¡ã€ã«ã«ã³ã³ãã€ã«ããæ¹ãã¯ããã«åªããŠããŸãã ããããã°ãåããŒãžã«å¿
èŠãªCSSã¹ã¿ã€ã«ã®ã¿ãããŒãã§ããŸãã
ã©ããã£ãŠããã®ãããããŸãããã
ç§ã®ãã«ãªã¯ãšã¹ãããã§ãã¯ã¢ãŠãããŠãã ãããç§ã¯è¯ã解決çããããšæããŸãïŒ
https://github.com/zeit/next.js/pull/2638
@ cr101ããã¯å®éã«æ¬åœã§ãã ç¬èªã®å
éšUIã©ã€ãã©ãªãããŸããŸãªãããžã§ã¯ãã«ã€ã³ããŒãããŠãããããããŒããããã¡ã€ã«ã®ãã£ã³ã¯ã¯åžžã«èšå€§ã§ãïŒç§ãç¥ã£ãŠããçæ³ã§ã¯ãããŸãããããã®ç£ã®ã¢ãžã¥ãŒã«åã«åãçµãã§ããŸãïŒã compile and serve 1 file
ããX number of files at X locations
ãŸãã å°ããªCSSãã£ã³ã¯ã«åå²ããããšãšãå€éšã®ãã£ãã·ã¥å¯èœã§ããã©ãŒãã³ã¹ã®é«ãCDNã§ãã¹ããããããŒãžã§ã³ãšã®ãã¬ãŒããªããèæ
®ãããšãããè€éã«ãªãããã楜ãããããããžã§ã¯ãèªäœãé¢äžãããšæããŸãã ç·šé-NextãåŠçããããšãæå³ããŠããããšã®ç¯å²ãã確å®ã«å€ããŠããŸããç§ãã¡ãç®æãã¹ãæåã®æ¹æ³ã¯ãNextãã©ã°ã€ã³ãŸãã¯ãã¿ãŒã³ã§ãã
ããã«ããã©ãŒãã³ã¹ã®åé¡ããããã©ããã¯ããããŸããããã¹ã¿ã€ã«ä»ãã³ã³ããŒãã³ããªã©ã䜿çšããŠããå Žåãããã¯éåžžã«ç°¡åãªè§£æ±ºçã§ããCSSã©ãããŒãäœæããã ãã§ãã
import styled from 'styled-components';
const Collapse = props => (
<__Collapse>
{ props.children }
</__Collapse>
);
export default Collapse;
/**
* CSS
*/
const __Collapse = styled.div`
.rc-collapse {
background-color: #f7f7f7;
border-radius: 3px;
border: 1px solid #d9d9d9;
}
...
`;
import RcCollapse from 'rc-collapse';
import Collapse from '~/components/rc/Collapse';
const HelpPage = () => (
<Collapse>
<RcCollapse>
<RcCollapse.Panel header="Title">Content</RcCollapse.Panel>
</RcCollapse>
</Collapse>
);
ãã®ã¢ãããŒãã§ç§ãæ°ã«å
¥ã£ãŠããã®ã¯ã .css
ãã€ã³ããŒãããå Žåã«ãå
ã®ã«ãŒã«ã®äžã«ãªãŒããŒã©ã€ããèšè¿°ããªããŠãããœãŒã¹CSSããã«ã¹ã¿ãã€ãºã§ããããšã§ãïŒãšã«ããã»ãšãã©ã®å Žåãããè¡ãå¿
èŠããããŸãïŒã node_modules
ããã®.css
ãã¡ã€ã«ã
ããã¯ã babel-plugin-inline-importã䜿çšããŠCSSãã¡ã€ã«ãã€ã³ããŒãããããã®ç°¡åãªãœãªã¥ãŒã·ã§ã³ã§ãã
.babelrc
{
"presets": ["next/babel"],
"plugins": [
[
"inline-import",
{
"extensions": [".css"]
}
]
]
}
ããŒãž/ã³ã³ããŒãã³ã
import "prismjs";
import { PrismCode } from "react-prism";
import prismGlobalStyles from "prismjs/themes/prism.css";
export default () => {
return (
<div>
<style global jsx>
{prismGlobalStyles}
</style>
<PrismCode className="language-javascript">
{`function(noop) {
return noop;
}`}
</PrismCode>
{/* ... */}
</div>
);
};
@stovmascriptããã¯çŸãã解決çã§ãããããã§ããšã©ãŒãçºçããŸãïŒhttps://github.com/Hacker0x01/react-datepickerãã.cssãã«ããã€ã³ããŒãããŠããŸãïŒã ããã§ä»ã«äœããã¬ã€ããŠããªãã®ã§ããïŒ ãšã©ãŒãããå¥ã®ã¬ãã«ã®CSSããŒããå¿ èŠãªããã§ãã
@ hilarykitz ã @ stovmascriptãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ããã«æ©èœããŸããããªããåŸãŠãããšã©ãŒãç§ãã¡ã«éã£ãŠãããŸãããïŒ
@ stovmascript-ã©ã®ããã«ããŠbabelãã£ãã·ã¥ãåãé€ããŸããã
@ khrome83 node_modules /.cacheãã¯ãªã¢ããå¿ èŠããããŸã
ãã£ãã·ã¥ãã¯ãªã¢ããŠäžèšã§åäœããbabel-inline-loaderãã©ã°ã€ã³ã䜿çšããããè¯ã解決çãèŠã€ããŸããã ãã®æ¹æ³ã®åé¡ã¯ãã°ããŒãã«ã¹ã¿ã€ã«ããé©çšã§ããªãããšã§ãã <style jsx global>
ã¿ã°ã§äœ¿çšãããšãdata-jsxãæ£ããè¿œå ããããç®çãæ£ããç¡å¹ã«ãªããŸãã
ãã£ãã·ã¥ãã¯ãªã¢ããŠäžèšã§åäœããbabel-inline-loaderãã©ã°ã€ã³ã䜿çšããããè¯ã解決çãèŠã€ããŸããã ãã®æ¹æ³ã®åé¡ã¯ãã°ããŒãã«ã¹ã¿ã€ã«ããé©çšã§ããªãããšã§ãã éã§äœ¿çšããå Žå
@stovmascriptã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠäŸãè¿œå ããŸããã
è€æ°ã®å€éšCSSãã©ã®ããã«å«ããŸããïŒ
åãã³ã³ããŒãã³ãã§ãããå¿
èŠãšãã2ã€ã®ã©ã€ãã©ãªã䜿çšãããããããå¥ã
ã«æ©èœããŸãããããããçµã¿åãããæ¹æ³ãããããŸããã
import rtStyle from 'react-table/react-table.css';
import dpStyle from 'react-datepicker/dist/react-datepicker.css';
...
render() {
return (
<div>
{/* <style jsx global>{ rtStyle }</style> */}
<style jsx global>{ dpStyle }</style>
...
@CHarnelã¯<style jsx global>{ rtStyle }{dpStyle}</style>
è©ŠããŠãã ãã
@almeynmanã¯ãããååŸããŸãïŒ
Module build failed: SyntaxError: C:/.../components/activeUsersTable.js:
Expected one child under JSX Style tag, but got 2 (eg: <style jsx>{`hi`}</style>)
@CHarnelã¯äž¡æ¹ããã³ãã¬ãŒãæååã«å ¥ããŠã¿ãŠãã ãã
@CHarnelã¯ãã®ã¢ãããŒããè©ŠããŠãã ãã
<style jsx global>{
$ {rtStyle} $ {dpStyle} }</style>
@alanhr
ç§ã¯ãããã®cssã1ã€ã®jsãã¡ã€ã«ã«å ¥ããŠãšã¯ã¹ããŒãããããšããŸã
import bootstrap from 'bootstrap/dist/css/bootstrap.min.css'
import styles from './index.css'
export default bootstrap + styles
ãããŠãã
import styles from '../styles'
...
<style jsx global>{styles}</style>
ç§ãäœæããhttps://github.com/sheerun/extracted-loaderã䜿çšãããšãExtractTextPluginãéçºãšæ¬çªã®äž¡æ¹ã«äœ¿çšã§ããŸããéçºäžã«å¥ã®HTMLã䜿çšããããjsã«cssãæ¿å ¥ãããããå¿ èŠã¯ãããŸããã
@comusç§ã¯ããªãã®ã¢ãããŒãã䜿çšããŸããã
@sheerunããããããããšã
next.jsã«ããã«å
æ¬çãªäŸãéä¿¡ããŸããã
https://github.com/zeit/next.js/pull/3451
ããã¯nextjsv4ããåã«æ©èœããŠããŸãã
<style jsx global>{style}</style>
<style jsx global>{colors}</style>
<style jsx global>{layout}</style>
ãã®ã¢ãããŒãã䜿çšããŠjsxã°ããŒãã«ã¹ã¿ã€ã«ãããŒãããçç±ã¯äœã§ããïŒ <style jsx global>{ rtStyle }{dpStyle}</style>
ç§ã¯emit-files-loader
åºã¥ãããœãªã¥ãŒã·ã§ã³ãèªåã§äœæããŸããã èå³ã®ããæ¹ã¯ããã«æçš¿ã§ããŸãããã«ã¹ã¿ã ãµãŒããŒã®èšå®ã«äŸåããŠããŸããåºæ¬çã«ã .next
ãã«ããã£ã¬ã¯ããªå
ã®åäžã®ãã£ã¬ã¯ããªãéçã«æäŸã§ããå¿
èŠããããŸãã ãµãŒããŒã®/_next/...
ãã¹æ§é ã«äŸåããããšã§ããµãŒããŒãªãã§æ§æã§ããå¯èœæ§ããããŸãã
ãã以å€ã¯import stylesheet from './styles/style.[scss|less|stylus|w/e]';
ãšæžãããšãã§ãããããã¹ã¿ã€ã«ã·ãŒããã¡ã€ã«ãžã®ãããªãã¯ãã¹ã«ãªãã®ã§ã <link>
å
¥ããããšãã§ããŸãã æ°žç¶ãã£ãã·ã¥çšã®?[hash]
ãå«ãŸããããããªããŒããå®è¡ããŸãã
@nikolakanackiã®å ¬åŒãµããŒãã¯ãŸããªãå°å ¥ãããŸãðhttps
@timneutkensãããèŠãããšããããŸããããããã«ããšããèŠç©ããã¯ãããŸããïŒ ãã§ã«ã«ããªã¢ã«å
¥ã£ãŠããããã§ãã
ç§ã¯ããã«è§£æ±ºçãå¿
èŠã§ã2ã3æ¥ãããŠè§£æ±ºçãæ¢ããåºæ¬çã«ãç°¡åãªä¿®æ£ãã§ããç¬èªã®è§£æ±ºçãäœæããããšãã§ããŸããã ç§ã¯ãããextract-text-webpack-plugin
ãšçµã¿åãããŠããã¹ãŠã®åå¥ã®.[css|stylus|less|scss]
ãã¡ã€ã«ãéçã«çµåããéåžžã®ããã«ãã¹ãŠãåäžã®éçãªãœãŒã¹ãšããŠå©çšã§ããããã«ããããšãèããŠããŸãã
ãããã®åé¡ã®èåŸã«ããäž»ãªåé¡ã¯ãæ¬çªãã«ããšéçºãã«ãã®èåŸã§ããã¯ã°ã©ãŠã³ãã§å€ãã®ãéæ³ããèµ·ãã£ãŠããããšã§ããããããªããŒããªã©ããããŸã...ãããããœãŒã¹ãèªãã§ãç©äºãã©ã®ããã«çµã¿ç«ãŠãããŠããããèŠãããšãã§ããŸããããããããäœã£ã誰ããããã«ã€ããŠããã€ãã®ããã¥ã¡ã³ããæžãããçŽ æŽãããã§ããããç§ã¯ãã£ãšå€ãã®äººã ãè²¢ç®ã§ãããšæããŸãã
@nikolakanackiããã«ðð€
ãããextract-text-webpack-pluginãšçµã¿åãããŠããã¹ãŠã®åå¥ã®ã[css | stylus | less | scss]ãã¡ã€ã«ãéçã«çµåããéåžžã®ããã«ãã¹ãŠãåäžã®éçãªãœãŒã¹ãšããŠå©çšã§ããããã«ããããšãèããŠããŸãã ã
次ã®v5çšã«äœæãããã©ã°ã€ã³ã¯ãã§ã«ãããè¡ã£ãŠããããŸããªããªãŒãã³ãœãŒã¹ã«ãªããŸãð
å éšã«é¢ããããã¥ã¡ã³ãã®äœæã«é¢ããŠã¯ãv5ããªãªãŒã¹ãããåŸã«ãã¹ãŠãã©ã®ããã«æ©èœããããææžåããäºå®ã§ãð
@timneutkensããããšãããããŸãïŒ
@timneutkensã¢ããããŒããããããšãããããçéžãããããã«ã¢ããããŒããæçš¿ããŠãã ããïŒ
ããã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
ããªããæåŸ ããŠããä»ã®ãã¥ãŒã¹ãããããŸããð€
ããã¯Next.jsv5ã§ãªãªãŒã¹ãããŸããã
ããã¯readmehttps ïŒ //github.com/zeit/next.js#importing -css--sass--less--stylus-filesã«ããããŸã
ãŸããèšåãããPRã¯çµ±åããããã®åé¡ã¯è§£æ±ºãããŸããã
ã«ãŒããããžã§ã¯ãã«/ staticãã©ã«ããŒãäœæããfile.cssã/ staticå ã«é 眮ããŠããããããŒhtmlæ§é ããã¯ã«ã
import Head from 'next/head';
<Head>
<meta charset="utf-8" />
<link rel="stylesheet" href="/static/css/custom.css" />
</Head>
ãããŠãã©ãã§ãclassNameã䜿çšããŠãã ããïŒ
@comus
éåžžã«å æ¬çã§ã¹ããŒãã§ããããã«æè¬ããŸããç§ã¯ãã®çš®ã®ãœãªã¥ãŒã·ã§ã³ãäžæ¥äžæ¢ããŠããŸããã
ã«ãŒããããžã§ã¯ãã«/ staticãã©ã«ããŒãäœæããfile.cssã/ staticå ã«é 眮ããŠãããããããŒhtmlæ§é ããã¯ã«é 眮ããŸãã
import Head from 'next/head'; <Head> <meta charset="utf-8" /> <link rel="stylesheet" href="/static/css/custom.css" /> </Head>
ãããŠãã©ãã§ãclassNameã䜿çšããŠãã ããïŒ
ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãïŒpackage.jsonãã¡ã€ã«ãé 眮ãããŠããå ŽæïŒã«ãpublicããã©ã«ããŒãäœæããŸãã
ïŒ8626çµç±ã§ãµããŒããè¿œå ãããŠããŸãïŒ
æãåèã«ãªãã³ã¡ã³ã
ããã¯ã babel-plugin-inline-importã䜿çšããŠCSSãã¡ã€ã«ãã€ã³ããŒãããããã®ç°¡åãªãœãªã¥ãŒã·ã§ã³ã§ãã
.babelrc
ããŒãž/ã³ã³ããŒãã³ã