рдЗрд╕ рдкрд░ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╛рдЪрд╛рд░ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?
рдореИрдВрдиреЗ рдЗрд╕реЗ razzle.config.js . рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛
"use strict";
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
modify: (config, { target, dev }, webpack) => {
const appConfig = Object.assign({}, config);
// Setup SCSS
if (target === "web") {
appConfig.module.rules.push(
{
test: /\.(sa|sc|c)ss$/,
use: [
dev ? 'style-loader' : MiniCssExtractPlugin.loader,
'css-loader',
'sass-loader',
]
}
);
}
else {
// On the server, we can just simply use css-loader to
// deal with scss imports
appConfig.module.rules.push({
test: /\.(sa|sc|c)ss$/,
use: "css-loader"
});
}
return appConfig;
}
};
рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛:
"devDependencies": {
"css-loader": "^1.0.0",
"mini-css-extract-plugin": "^0.4.1",
"node-sass": "^4.9.2",
"razzle": "^2.4.0",
"sass-loader": "^7.1.0"
}
рд╣реЛрд▓рд╛! рддреЛ рдпрд╣рд╛рдБ рд╕реМрджрд╛ рд╣реИ, рдУрдкрди рд╕реЛрд░реНрд╕ рдФрд░ рдореЗрд░реЗ рджрд┐рди рдХреЗ рдХрд╛рдо рдФрд░ рдЬреАрд╡рди рдХреЗ рдмреАрдЪ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ GitHub рдмреЙрдЯ рдЗрд╕реЗ рдмрд╛рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдпрджрд┐ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдХреЛрдИ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рди рд▓реЗрдВ--рдЧрдВрднреАрд░рддрд╛ рд╕реЗ--рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИ, рддреЛ рдмрд╕ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рдореБрдЭреЗ рдбреАрдПрдо рдХрд░реЗрдВ, рдПрдХ рд╡рд╛рд╣рдХ рдХрдмреВрддрд░, рдпрд╛ рдПрдХ рдзреВрдореНрд░рдкрд╛рди рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдВред
@jaredpalmer рдХреНрдпрд╛ рдЖрдк Hacktoberfest рд▓реЗрдмрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?
рд╣рд╛рдБ
рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░
рдмреЗрд╢рдХ, рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЕрдЧрд▓реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рддрд░рд╣?
рд╕рдВрдХреБрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВред рдЖрдк рд╡рд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ scss рдПрдХреАрдХрд░рдг рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╕рд╛рдЭрд╛ рдХрд░реВрдБрдЧрд╛, рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛред
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореБрдЭреЗ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл рдореВрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рд▓реЛрдбрд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред
'use strict';
const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder');
const paths = require('razzle/config/paths');
const cssLoaderFinder = makeLoaderFinder('css-loader');
module.exports = {
modify(baseConfig, {dev}, webpack) {
/* make a copy of config */
const config = Object.assign({}, baseConfig);
const scssLoader = {
loader: require.resolve('sass-loader'),
options: {
sourceMap: dev,
},
};
// Copy base css rules and add scss support
config.module.rules.filter(cssLoaderFinder).forEach(rule => {
const isCssModuleRule = !rule.test.test('module.css');
const scssExclude = [paths.appBuild];
let scssTest = /\.s[ac]ss$/;
if (isCssModuleRule) {
scssTest = /\.module\.s[ac]ss$/;
} else {
scssExclude.push(/\.module\.s[ac]ss$/);
}
// Use default configs
config.module.rules.push({
test: scssTest,
exclude: scssExclude,
use: [
...rule.use,
scssLoader,
]
});
});
// adding ./src to module resolver so I can import modules with absolute paths
config.resolve.modules.push('./src');
return config;
},
};
рдореИрдВ scss рдПрдХреАрдХрд░рдг рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╕рд╛рдЭрд╛ рдХрд░реВрдБрдЧрд╛, рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛред
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореБрдЭреЗ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл рдореВрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рд▓реЛрдбрд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред
'use strict'; const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder'); const paths = require('razzle/config/paths'); const cssLoaderFinder = makeLoaderFinder('css-loader'); module.exports = { modify(baseConfig, {dev}, webpack) { /* make a copy of config */ const config = Object.assign({}, baseConfig); const scssLoader = { loader: require.resolve('sass-loader'), options: { sourceMap: dev, }, }; // Copy base css rules and add scss support config.module.rules.filter(cssLoaderFinder).forEach(rule => { const isCssModuleRule = !rule.test.test('module.css'); const scssExclude = [paths.appBuild]; let scssTest = /\.s[ac]ss$/; if (isCssModuleRule) { scssTest = /\.module\.s[ac]ss$/; } else { scssExclude.push(/\.module\.s[ac]ss$/); } // Use default configs config.module.rules.push({ test: scssTest, exclude: scssExclude, use: [ ...rule.use, scssLoader, ] }); }); // adding ./src to module resolver so I can import modules with absolute paths config.resolve.modules.push('./src'); return config; }, };
рдирдорд╕реНрддреЗ, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЖрдкрдХреЗ рд░реИрдЬрд╝рд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХрд┐рди рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдЖрдк рдЙрдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗ
@Toyurc рдореИрдВрдиреЗ [email protected]
рдФрд░ [email protected]
ред
рдирдорд╕реНрддреЗ рдХреНрдпрд╛ рдХрдо рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ?
рдореБрдЭреЗ рд╕рдордЭ рдЖ рдЧрдпрд╛
Module parse failed: Unexpected character '@' (1:0)
You may need an appropriate loader to handle this file type.
> <strong i="7">@import</strong>
рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЖрджрд┐
рдирдорд╕реНрддреЗ рдХреНрдпрд╛ рдХрдо рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ?
рдореБрдЭреЗ рд╕рдордЭ рдЖ рдЧрдпрд╛Module parse failed: Unexpected character '@' (1:0) You may need an appropriate loader to handle this file type. > <strong i="8">@import</strong>
рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЖрджрд┐
.less
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╕рд╛рд╕ рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
'use strict';
const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder');
const paths = require('razzle/config/paths');
const cssLoaderFinder = makeLoaderFinder('css-loader');
module.exports = {
modify(baseConfig, {dev}, webpack) {
/* make a copy of config */
const config = Object.assign({}, baseConfig);
const lessLoader = {
loader: require.resolve('less-loader'),
options: {
sourceMap: dev,
},
};
// Copy base css rules and add less support
config.module.rules.filter(cssLoaderFinder).forEach(rule => {
const isCssModuleRule = !rule.test.test('module.css');
const lessExclude = [paths.appBuild];
let lessTest = /\.less$/;
if (isCssModuleRule) {
lessTest = /\.module\.less$/;
} else {
lessExclude.push(/\.module\.less$/);
}
// Use default configs
config.module.rules.push({
test: lessTest,
exclude: lessExclude,
use: [
...rule.use,
lessLoader,
]
});
});
// adding ./src to module resolver so I can import modules with absolute paths
config.resolve.modules.push('./src');
return config;
},
};
less-loader
рдФрд░ less
рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдП рд╣реИрдВред рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рд╕рдордп рдХреЛрдИ рдХрдо рдкреИрдХреЗрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдПрдХ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдкреНрд▓рдЧрдЗрди рд╣реИред
рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдкреИрдХреЗрдЬ рдЕрдм рдпрд╣рд╛рдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
https://www.npmjs.com/package/razzle-plugin-scss
рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
https://github.com/jaredpalmer/razzle/tree/master/examples/with-scss
рджреЛрдиреЛрдВ рдиреЗ рдЕрдЧрд▓реА рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛, рдмрдВрдж рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВрдиреЗ рдЗрд╕реЗ razzle.config.js . рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛
рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛: