ããã¯ç§ãç¥ã£ãŠããåé·ãªåé¡ã§ãããç§ã¯ãã®åé¡ãæå³çã«éããŸããã next.jsãã€ã©ãŒãã¬ãŒãïŒreduxãredux-sagaãªã©ïŒãã»ããã¢ããããã®ã«3æ¥ããããå€éšcssãã¡ã€ã«ãšscssãã¡ã€ã«ã®ããŒãã®ã»ããã¢ããã«è¡ãè©°ãŸãã®ã¯2æ¥ã§ãã with-global-stylesheetãšwith-scoped-stylesheet-and-postcssã®äŸã確èªããŸããããããããã«åã®å·ã§è¿°ã¹ã倧ããªåé¡ããããŸãã ããã¯ã§ãã®åé¡ã解決ããŠãããªãŒãã³ããã³ã¯ããŒãºã®åé¡ãå€ãããŸã...åé¡ãæ®ããŠæè¯ã®è§£æ±ºçãèŠã€ããã®ã§ã¯ãªããçŸåšå©çšå¯èœãªè§£æ±ºçã§è§£æ±ºããŠãããè¯ã解決çãèŠã€ããããšããå§ãããŸãã å€ãã®äººãä»ãã®åé¡ãæ±ããŠããŠãä»ããã解決ãããã®ãèŠããããã§ãïŒ
ç§ã¯åæããŸããstyled-jsxã ããã¯ãªãŒã³ãªïŒããããªããŒããå«ãïŒãµããŒããæã£ãŠããããããç§ãã©ããããããã¿ã€ãã³ã°ãå¿ èŠãšãããšã以å€ã«Next.jsã䜿çšããããšã劚ããŠããçç±ã§ãã
CSSã¢ãžã¥ãŒã«ã®CSSã®ã¹ã³ãŒãã®åé¡ã«å¯Ÿãã解決çã¯ã¯ããã«ã¯ãªãŒã³ãªãã®ã ãšæããŸããããã«ãCSSã¢ãžã¥ãŒã«ã䜿çšãããšãã¯ã©ã¹ãåã³ã³ããŒãã³ãã«æž¡ãããšãã§ããŸãïŒ babel-plugin-inline-react-svg
ã€ã³ããŒããããSVGã«éã°ããŒãã«ã¯ã©ã¹ãé
眮ããŠã¿ãŠãã ããïŒ styled-jsxã䜿çšïŒã
ãããšç§ã¯ããã¬ãŒã ã¯ãŒã¯ã®ããã¯ã€ã³ãå¯èœãªéãé²ãããã«.css
ãã¡ã€ã«ãæšæºåãããã£ãã·ã¥çšã«æ¬çªç°å¢ã§å€éšCSSãã¡ã€ã«ã䜿çšããããšã奜ã¿ãŸãïŒãããŠãéãæªããã°Respond.jsã®ãããªMQããªãã£ã«ãæ©èœãããããã«ãŸã IE8ããµããŒãããå¿
èŠããããŸãïŒã
倧èŠæš¡ãª+1
å€éšã®css / scssã®ãããªåçŽãªããšãnext.jsã§å®çŸããããšã¯ã»ãšãã©äžå¯èœã§ããããããç§ã®ã¢ããªã±ãŒã·ã§ã³ã®90ïŒ
ã§åœ¹ã«ç«ããªãããšã¯ã倧ããªãã©ã¹ãã¬ãŒã·ã§ã³ã§ãã
ããŒãã¹ãã©ããã䜿çšããŠããŸãããå€éšã¹ã³ãŒãã®cssãè¿œå ããŠãã°ããŒãã«ããŒãã¹ãã©ããcssã€ã³ããŒãã1ã€ããæ§æãå¿ èŠã§ãã
ã¹ã¿ã€ã«ä»ãjsx1ïŒã³ã³ãã€ã«ãåŠçããããã®webpackïŒã§å€éšã¹ã¿ã€ã©ã¹ãåäœãããããšãã§ããŸããããåå¥ã®cssãã¡ã€ã«ã®åŠçã®å€æŽãå°å
¥ããããããã¹ã¿ã€ã«ä»ãjsx2ã§ãããç解ããã®ã«èŠåŽããŸããã
çŸåšã®ã¢ãããŒãïŒ
import ComponentStyles from './footer.styl';
...
<style jsx>
{ComponentStyles}
</style>
https://github.com/zeit/next.js/tree/master/examples/with-styled-jsx-scssãå€éšã®scssãã¡ã€ã«ãæäœããŠããã®ãèŠãã®ã¯çŽ æŽãããããšã§ãã
ç°å¢ãæŽãããšããåãè©Šç·ŽãçµéšããŸããã
æçµçã«ã¯ãscss + postcssãšlost-gridã䜿çšããã°ããŒãã«ã¹ã¿ã€ã«ã·ãŒãã§è§£æ±ºããŸããã
ããããªããŒãã¯æ©èœãããããïŒã°ããŒãã«ã¹ã¿ã€ã«ã·ãŒããäžåºŠã«ããŒããããããïŒçæ³çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãããã劥åç¹ãšããŠã¯åé¡ãããŸããã
äŸåé¢ä¿
"autoprefixer": "^7.1.6",
"babel-plugin-module-resolver": "^2.7.1",
"babel-plugin-wrap-in-js": "^1.1.1",
"node-sass": "^4.5.3",
"sass-loader": "^6.0.6",
"pixrem": "^4.0.1",
"postcss-easy-import": "^3.0.0",
"postcss-loader": "^2.0.8"
package.json
...
"postcss": {
"plugins": {
"lost": {},
"postcss-easy-import": {
"prefix": "_"
},
"autoprefixer": {},
"pixrem": {}
}
}
...
next.config.js
webpack: (config, { dev }) => {
config.module.rules.push(
{
test: /\.(css|scss)/,
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]'
}
}
,
{
test: /\.css$/,
use: ['babel-loader', 'raw-loader', 'postcss-loader']
}
,
{
test: /\.s(a|c)ss$/,
use: ['babel-loader', 'raw-loader', 'postcss-loader',
{ loader: 'sass-loader',
options: {
includePaths: ['styles', 'node_modules']
.map((d) => path.join(__dirname, d))
.map((g) => glob.sync(g))
.reduce((a, c) => a.concat(c), [])
}
}
]
}
)
return config
}
pages/_document.js
...
import stylesheet from 'styles/main.scss'
...
<Head>
<style dangerouslySetInnerHTML={{ __html: stylesheet }} />
</Head>
...
ãããŠã/ styles /main.scssããã¹ã¿ã€ã«ã管çã§ããŸãã
ããã圹ã«ç«ãŠã°å¹žã
ãããã®2ã€ã®ã¹ã¿ã€ã«äŸïŒ with-global-stylesheetãšwith-scoped-stylesheets-and-postcss ïŒã®ããããã«é¢ããç§ã®åé¡ã¯ãã¹ãããã·ã§ããå ã®CSSã䜿çšããJestããã³Snapshotãã¹ããšã®çµ±åãç°¡åã§ã¯ãªãããšã§ãã JestãWebpackã§åäœãããããšã«æåãã人ãããŸãããããã¯ç¹ã«CSSãã¹ãããããããšã«ãããã®ã§ãã
ãã®SOã®åçã§èª¬æããbabel-jest
ããªããã»ããµãââã¡ã€ã«ãå®è¡ããããšã¯ãéåžžã«æªãããã¯ã®ããã§ãã
with-global-stylesheetã®ããã«å€éšCSSãååŸããããã§ãããJestã䜿çšããã«ã¯ãWebpackã«äŸåããããšã¯ã§ãããBabelã®ã¿ã«äŸåããŸãã
ãã®åéã§èª°ãã¢ã€ãã¢ããããŸããïŒ
ç§ãåæ§ã®åé¡ã«çŽé¢ããŠããŸãã nextjsã¯åããŠã§ããwith-external-scoped-cssãã®äŸãæ£ããæ©èœãããããšãã§ããŸããã ç§ã®cssãããŒããããããšãããã°ãããŒããããªãããšããããŸãã ãããããªãã話ããŠããã®ãšåãåé¡ã§ãããã©ããã¯ããããŸããã
ãã®ããŒããŒã§è§£æ±ºãããå€éšã¹ã¿ã€ã«ã®åé¡https://github.com/coox/styled-jsx-css-loader
@ilionicç§ã¯ããªãã®è§£æ±ºçããã§ãã¯ããŸããã ããã¯çŽ æŽãããïŒ ããããšãããããŸãã ïŒïŒ
@arefaslaniãã®åé¡ã¯è§£æ±ºãããŠããªããšæããŸãã
HTTP v1ã®æç¹ã§ã¯ã倧éã®CSSãããŒãããã®ã¯äŸç¶ãšããŠæãããããã©ãŒãã³ã¹çšã§ãããæåã«æç»ãããŸã§ã®æéãåçã«é·ããªããŸãã
é©åãªå€éšã¹ã¿ã€ã«ã®ãµããŒãã«ãããCSSã®ã€ã³ããŒããå¯èœã«ãªããçµæãšããŠã€ã³ã©ã€ã³ã§ã¯ãããŸãã...
Also, this suggestion doesn't resolve use cases where a CSS framework like bootstrap needs to be included from node_modules. Including Bootstrap as an inline CSS on every page would be horrible. And would negate the benefits of browser caching, e.t.c
In short, I really don't think this issue can be closed... It's still very much an ongoing problem.
@israelidannyç§ã¯ããªããããŒãã¹ãã©ããã«ã€ããŠäœãæå³ããã®ãç¥ã£ãŠããŸããããã¯éã®åŒŸäžžã®è§£æ±ºçã§ã¯ãããŸããã ããŒãã¹ãã©ãããã¬ãŒã ã¯ãŒã¯ã®ã³ã¢éšåãæœåºããŠcssãã¡ã€ã«ãåé¢ãããã©ãŠã¶ãŒãããããã£ãã·ã¥ã§ããããã«ããŸãã çæ³çã§ã¯ãããŸããããããªããã»ããµãšCSSãã¬ãŒã ã¯ãŒã¯ãåŠçããããšã®ãã®åä»ãã¯ãæ°ããcss-in-jsã¢ãããŒããæšé²ããCSSãã¬ãŒã ã¯ãŒã¯ãžã®äŸåãåæžããŸãã
@ilionicç§ã¯ããªããèšã£ãŠããããšãç解ããŠããŸãããããã§ã-倧éã®ã€ã³ã©ã€ã³CSSããããšãããã©ãŒãã³ã¹ïŒç¹ã«æåã®ãã¬ãŒã ãŸã§ã®æéïŒã«æªåœ±é¿ã
ç¹ã«ãµãŒããŒã§ã¬ã³ããªã³ã°ãããDOMã䜿çšã§ãããšããäºå®ãèãããšãããããã¹ãŠã倱ãã®ã¯æ®å¿µã§ãã
ãã¶ããã®åé¡ãéããŸãããç¹ã«å€éšCSSããªã³ã¯ã§ãããœãªã¥ãŒã·ã§ã³ã®ããã«æ°ããåé¡ãéããŸããïŒ
æããã«æ®åããŠããéçºæ
£è¡ãç¡èŠããã®ã¯å¥åŠãªããšã§ãã
@israelidannyã¯åæããŸããç§ãã¡ã¯ãŸã CSSã®ããã©ãŒãã³ã¹ã«èŠåŽããŠãããå€§å¹ ãªæžãçŽãããªããã°ãããã解決ããæ¹æ³ãæ確ã§ã¯ãªããããå®éã«ãã®åé¡ã¯ããã«æ·±ããªããŸãã ãã®å Žåãããããstyled-jsxã®æ¹ãé¢é£æ§ã®é«ããªããžããªã§ããïŒ
@ilionicããŒããstyled-jsxãªããžããªãã©ã®ããã«é©åãªå Žæã«ãªããããããŸããã
åé¡ã¯åœŒãã«ããã®ã§ã¯ãªããåé¡ã¯å€éšcssãã¡ã€ã«ã®next.jsãµããŒããæå¹ã«ããããšã§ããããã¯styled-jsxãšã¯äœã®é¢ä¿ããªããããããŸããã
ã©ãæããŸããïŒ
@israelidannyããã¯æåã®è§£æ±ºçã§ã¯ãããŸããã§ãããããšã«ããæ©èœããŸãã ããããããªãã¯æ£ããã§ãã ãã£ãã·ã¥ãªãã§ãã¹ãŠã®ããŒãžã«ãã¹ãŠã®CSSãã€ã³ã©ã€ã³åããããšã¯ãæåã®è§£æ±ºçã§ã¯ãããŸããã ãŸããç§ã¯ãã®éšåã§ããªãã«åæããŸãïŒ
åé¡ã¯åœŒãã«ããã®ã§ã¯ãªããåé¡ã¯å€éšcssãã¡ã€ã«ã®next.jsãµããŒããæå¹ã«ããããšã§ããããã¯styled-jsxãšã¯äœã®é¢ä¿ããªããããããŸããã
ãããŠ@ilionicã«çµ¶å¯Ÿã«åæã
ãã®å Žåãããããstyled-jsxã®æ¹ãé¢é£æ§ã®é«ããªããžããªã§ãã
ç§ã¯styled-jsx / cssããŒããŒã§ãœãªã¥ãŒã·ã§ã³ã管çããŸããã https://github.com/P233/nextjs-with-scssããã³ãŒããèŠãããšãã§ã
ãã ãã @import
ed scssãã¡ã€ã«ãç£èŠãããŠããããããããªããŒããããªã¬ãŒãããªãããšã«æ°ã¥ããŸãããããã¯ãæ¬åœã«ã€ã©ã€ã©ããŸãã
æœåºãããã¹ã¿ã€ã«ã·ãŒããã¡ã€ã«ãããããªããŒãããããã«https://github.com/sheerun/extracted-loaderãäœæããŸããã éçºã§ãããªãããŸãæ©èœããã®ã§ã dangerouslySetInnerHTML
ã¯å¿
èŠãããŸããã
ããªãã¯ããããã®ããã«äœ¿çšããŸãïŒ
config.module.rules.push({
test: /\.css$/,
use: ['extracted-loader'].concat(ExtractTextPlugin.extract({
/* Your configuration here */
}))
})
config.plugins.push(new ExtractTextPlugin('index.css'))
@sheerun ãããããšãããããŸãããCSSãã³ã³ããŒãã³ãã«æ¿å ¥ããã«ã¯ã©ãããã°ããã§ããïŒ
æ³šå ¥ããã®ã§ã¯ãªããExtractTextPluginã䜿çšããŠãã¹ãŠãæœåºãã次ã®ããã«èšè¿°ããŸãã
<Head>
<link rel='stylesheet' type='text/css' href="/static/index.css" />
</Head>
ã³ã³ããŒãã³ãã«æ¬¡ã®ãããªãã®ããããŸã
import './styles.scss'
ååãªã¯ãã§ã
ããããŸããããããä»ç§ã¯ãšã©ãŒããããŸãïŒ
./components/Home/Home.js
ã¢ãžã¥ãŒã«ãèŠã€ãããŸããïŒãšã©ãŒïŒãDïŒ\ Sites \ work \ VisualProposalãã®ãcss-loaderãã解決ã§ããŸãã
@ ./components/Home/Home.js 13ïŒ0-22
@ ./pages?entry
@ multi ./pages?entry
ç§ã®Home.jsã³ã³ããŒãã³ãïŒ
import { observer } from 'mobx-react';
import './Home.scss'
import MainSection from './MainSection/MainSection'
import Sections from './Sections/Sections';
import Features from './Features/Features'
import Pricing from './Pricing/Pricing';
import Footer from './Footer/Footer'
const Home = () => {
return (
<div className="Home">
<MainSection/>
<Sections/>
<Features/>
<Pricing/>
<Footer/>
</div>
)
};
export default observer ( Home );
ç§ã®next.config.jsïŒ
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
webpack: function ( config, { dev } ) {
config.module.rules.push({
test: /\.(sa|sc|c)ss$/,
use: ['extracted-loader'].concat(ExtractTextPlugin.extract({
use: [
"babel-loader",
{
loader: 'css-loader',
options: {
url: true,
minimize: !dev,
sourceMap: dev,
importLoaders: 2
}
},
{
loader: 'postcss-loader',
options: {
sourceMap: dev,
plugins: [
require('autoprefixer')({
/* options */
})
]
}
},
{
loader: 'sass-loader',
options: {
sourceMap: dev
}
}
]
}))
});
config.plugins.push(new ExtractTextPlugin('index.css'));
if ( config.resolve.alias ) {
delete config.resolve.alias['react'];
delete config.resolve.alias['react-dom']
}
for (let index = 0; index < config.plugins.length; index += 1) {
if (config.plugins[index].constructor.name === "UglifyJsPlugin") {
config.plugins.splice(index, 1, new UglifyJSPlugin({
sourceMap: true,
parallel: true,
}));
break;
}
}
return config
}
};
ã ããç§ã¯äœãééã£ãŠããã®ã§ããïŒ
SCSSãã¹ã¿ã€ã«ã·ãŒãã®urlïŒïŒãimg [src]ã䜿çšããããªãé«åºŠãªäŸãè¿œå ããŸããã ããã¯ãnow.shã§ããã«æ©èœããã¯ãã§ãããããããªããŒããšãšã¯ã¹ããŒããé©åã«æ§æãããŠããŸãã
https://github.com/sheerun/extracted-loader/tree/master/examples/with-next
@psycura Windowsã䜿çšããŠããã®ã§ãããã«ã¯æ©èœããªãå¯èœæ§ããããŸãããä¿®æ£PRãéä¿¡ããŠãã ãã
ðå€éšã®cssãã¡ã€ã«ãæäœã§ããªãããšãNextjsã«æ®å¿µã«æããŸãã ãããžã§ã¯ãã§äœ¿çšãããç¬èªã®ã¹ã¿ã€ã«ã·ãŒããåããããã«äœ¿çšã§ããããã±ãŒãžããããããããŸãã ããããç§ã¯ã§ããŸããïŒ ç§ã¯ããã€ãã®ãªãã·ã§ã³ãè©ŠããŸããããå®éã«ã¯èª°ãæ©èœããŸããã§ããããã§ã«ããã«1æ¥ãè²»ãããŸããã
@mkozhukharenkocssããã³scssãã¡ã€ã«ã§åäœããŸãã https://github.com/coox/styled-jsx-css-loaderã䜿çšããŠäŸãè¿œå ã
@arefaslaniç§ã¯ãã¹ãŠã®ãªãã·ã§ã³ãè©ŠããŸããããã©ã¡ãã
@mkozhukharenkoãã®äŸãèŠãŠãã ããïŒ https ïŒ
ãã¡ã€ã«ã«ãã£ãšå€ãã®cssãè¿œå ããããšãããšã styled-jsx
ããããåŠçã§ããªãããšãããããŸãã ãjsx-undefindããã«ãŠã³ãã«ãªããªãããŸãã¯ãjsx-4231512ããèŠã€ãããªããšãããšã©ãŒãçºçããŸã
@arefaslaniãã®ãã¿ãŒã³ãããªãã®äŸã§äœ¿çšããæ¹æ³ã¯ãããŸããïŒ
import classes from './styles.scss'
const MyComponent = () => (
<header className={classes.header}>Hello</header>
)
@protoEvangelionæ®å¿µãªãããçŸåšã¯styled-jsxã§ã®ã¿æ©èœããŸãã
è¿ éãªå¯Ÿå¿ã«æè¬ããŸã:)
next.jsã®ãã«ãããæåã¯æ¢åã®ãªãœãŒã¹ã®åå©çšãèæ ®ããŠããªãã®ã¯æ®å¿µã§ãã cssãã¡ã€ã«ã®ããã ãã«è€éãªã«ãŒã«ãèšå®ããã®ã¯æéã®ç¡é§ã§ãã
ç§ã¯ããã¹ãŠã®WebpackããŒããŒãæ©èœããããšãå¯èœã«ãããã®åé¡ã®è§£æ±ºçã«åãçµãã§ããŸãã
ãŸããç§ã¯å人çã«ãã®åé¡ã§äººã
ãæã£ãŠããå£èª¿ã奜ãã§ã¯ãªãããšãææããããšæããŸãã
ç§ã¯ããªããcssãã€ã³ããŒãããããšæã£ãŠããããšãå®å
šã«ç解ããŠããŸãã ãããŠãç§ãã¡ã¯ãã®èŠæ±ãããç¥ã£ãŠããŸãã ãã®ãããç§ã¯ãã®1é±éãå¯èœãªéãæè¯ã®ãœãªã¥ãŒã·ã§ã³ã«åãçµãã§ããŸããð
ããã«ã€ããŠã¯ããã«è©³ãã説æããŸãã ãããŸã§ã¯ã芪åã§å¹žããªäŒæ¥ããéãããã ããð
ð
ããã«ã¡ã¯ãçãããç§ã¯ä»ã®githubã§è§£æ±ºçãèŠã€ããŸããã
ã¹ã±ã«ãã³ããŒããŒã䜿çšããŠBEMã«ãŒã«ã«åŸããcss-modulesãšåãå¹æãå®çŸããŸãã
.scss.jsonãçæããŠããããŽãç®±ã䜿çšããŠçæããã.scss.jsonãåé€ããå¿
èŠãããããã§ããçæ³çã§ã¯ãªãããã«æããŸãããä»ã«ãã£ãšè¯ãæ¹æ³ããããã©ããã確èªããããã«éä¿¡ããŸãã
Hi, everybody, I found a solution on another github,
Use skeleton-loader to comply with BEM rules to achieve the same effect as css-modules,
Because it will need to generate. Scss.json, then use the trash will be generated. Scss.json delete
Although it feels less than ideal, give it to you to see if there are any other better ways
@timneutkensãœãªã¥ãŒã·ã§ã³ã¯ã©ãã§ããïŒ
scssãcssããã®ä»å€ãã®æ©èœã®ã€ã³ããŒãããµããŒãããNextãã€ã©ãŒãã¬ãŒããäœæããŸããã ãããèŠãŠãããªããããã奜ããªããããã«æãä»ããŠãã ãã;ïŒ
https://arefaslani.github.io/next-boilerplate
@BobetaåäœããŠããŸã
@timneutkensèããŠ
@Bobetaå ¬éãããŠäœ¿çšã§ããããã«ãªã£ããã圌ã¯ãã®ã¹ã¬ããã«æçš¿ãããšç¢ºä¿¡ããŠããŸãã
@jthegedus圌ã@timneutkensã«åºã¥ããŠæ±ºå®ããŸãã
æãåèã«ãªãã³ã¡ã³ã
ãŸããç§ã¯å人çã«ãã®åé¡ã§äººã ãæã£ãŠããå£èª¿ã奜ãã§ã¯ãªãããšãææããããšæããŸãã
ç§ã¯ããªããcssãã€ã³ããŒãããããšæã£ãŠããããšãå®å šã«ç解ããŠããŸãã ãããŠãç§ãã¡ã¯ãã®èŠæ±ãããç¥ã£ãŠããŸãã ãã®ãããç§ã¯ãã®1é±éãå¯èœãªéãæè¯ã®ãœãªã¥ãŒã·ã§ã³ã«åãçµãã§ããŸããð
ããã«ã€ããŠã¯ããã«è©³ãã説æããŸãã ãããŸã§ã¯ã芪åã§å¹žããªäŒæ¥ããéãããã ããð ð