μμ§ ν΅ν©λκ³ μλ€λ μμμ΄ μμ΅λκΉ?
λλ μ΄κ²μ 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 λ΄μ μ¬μ©νμ¬ μ¬κΈ°μ κΈ°μ λͺ κ°μ§λ₯Ό μλνν©λλ€. μ΄ νΉμ GitHub λ΄μ μ΅κ·Ό νλμ΄ νλμ μμκΈ° λλ¬Έμ μ΄κ²μ λΆμ€ν κ²μΌλ‘ νμν κ²μ λλ€. λ©°μΉ λμ λ μ΄μ νλμ΄ μμΌλ©΄ νμλ©λλ€. μ΄ μμ μ κ°μΈμ μΌλ‘ μ¬κ°νκ² λ°μλ€μ΄μ§ λ§μμμ€. μ΄κ²μ μμ ν μλνλ μμ μ λλ€. μ΄κ²μ΄ μ€μλΌλ©΄ λκΈ, DM, μΊλ¦¬μ΄ λΉλκΈ° λλ μ°κΈ° μ νΈλ₯Ό 보λ΄μ£Όμμμ€.
@jaredpalmer Hacktoberfest λ μ΄λΈμ μΆκ°ν μ μμ΅λκΉ?
μ
μ’μ μ΄λ
λ¬Όλ‘ νλ¬κ·ΈμΈμ΄λ 무μμ μλ―Έν©λκΉ? λ€μ 곡μ νλ¬κ·ΈμΈμ΄ λ§μμ λμλμ?
ν¨ν€μ§ λλ ν 리μ 곡μ νλ¬κ·ΈμΈμ΄ μμ΅λλ€. κ±°κΈ°μμ λͺ κ°μ§ μλ₯Ό λ³Ό μ μμ΅λλ€.
λ΄ λ²μ μ sc ν΅ν©λ 곡μ νκ² μ΅λλ€. λκ΅°κ°μκ² μ μ©ν μ μμ΅λλ€.
scssμ λν CSS κ·μΉμ μ¬μ μν νμκ° μλ€κ³ μκ°νμ¬ μλ³Έμ 볡μ¬νκ³ 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;
},
};
λ΄ λ²μ μ sc ν΅ν©λ 곡μ νκ² μ΅λλ€. λκ΅°κ°μκ² μ μ©ν μ μμ΅λλ€.
scssμ λν CSS κ·μΉμ μ¬μ μν νμκ° μλ€κ³ μκ°νμ¬ μλ³Έμ 볡μ¬νκ³ 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; }, };
μλ νμΈμ, μ΄ razzle ꡬμ±μ μ¬μ©νλ €λ©΄ μ΄λ€ devDependenciesκ° νμν©λκΉ? λΉμ μ κ·Έλ€μ μΈκΈνμ§ λͺ»νμ΅λλ€
@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
ꡬμ±μ λ€μκ³Ό κ°μ΅λλ€. λλ λ μ¬μ©νμ§ μκ³ sassλ§ μ¬μ©νμ§λ§ μΌλ° κ·μΉμ΄ μ¬μ ν μ μ©λμ΄μΌ ν©λλ€.
'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
λ₯Ό μ€μΉν΄μΌ ν©λλ€.
λλ μ§κΈ ν΄κ²°λμλ€κ³ μκ°νλ scsμ λν λͺ κ°μ§ μ€λλ λ¬Έμ λ₯Ό νμ΄λ³΄κ³ μμ΅λλ€. νμ¬λ‘μλ ν¨ν€μ§κ° λ μ μ κ² κ°μ§λ μμ§λ§ μ§κΈμ scss νλ¬κ·ΈμΈμ΄ μμ΅λλ€.
scss ν¨ν€μ§κ° μ΄μ μ¬κΈ°μ κ²μλμμΌλ©° μ μκ² μ λ§μ΅λλ€.
https://www.npmjs.com/package/razzle-plugin-scss
μ¬κΈ°μμ μλ₯Ό μ°Έμ‘°νμμμ€.
https://github.com/jaredpalmer/razzle/tree/master/examples/with-scss
λ λ€ λ€μ λΆκΈ°μ μΆκ°λμ΄ λ«νλλ€.
κ°μ₯ μ μ©ν λκΈ
λλ μ΄κ²μ razzle.config.jsμμ νμ₯νμ΅λλ€.
κ°λ°μ μ’ μμ±: