Skip to content

Commit 5f512f2

Browse files
authored
feat: add support for less and less modules
Merge pull request #12 from Ctaque/add_support_for_less_modules
2 parents 2dfb052 + 1946f2e commit 5f512f2

File tree

7 files changed

+62
-21
lines changed

7 files changed

+62
-21
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Found any problem or bug? Please [create a new issue](https://github.com/jpavon/
2424
- Webpack 4
2525
- TypeScript compilation [ts-loader](https://github.com/TypeStrong/ts-loader)
2626
- Type and tslint errors on a separate process [fork-ts-checker-webpack-plugin](https://github.com/Realytics/fork-ts-checker-webpack-plugin)
27-
- Sass and Css Modules [css-modules](https://github.com/css-modules/css-modules)
27+
- Sass, Less and Css Modules [css-modules](https://github.com/css-modules/css-modules)
2828
- Generate TypeScript typings for CSS modules [typings-for-css-modules-loader](https://github.com/jpavon/typings-for-css-modules-loader)
2929
- Tranform SVG into React components [svgr](https://github.com/smooth-code/svgr)
3030
- Use `.js|.jsx` and `.ts|.tsx` files together.

config/webpack.base.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
1010

1111
function getStyleLoader(options) {
1212
const isSass = options && options.sass;
13+
const isLess = options && options.less;
1314
const isModules = options && options.modules;
1415

1516
let styleRegex = /\.css$/;
@@ -19,6 +20,11 @@ function getStyleLoader(options) {
1920
styleModuleRegex = /\.(module|m)\.(scss|sass)$/;
2021
}
2122

23+
if (isLess) {
24+
styleRegex = /\.(less)$/;
25+
styleModuleRegex = /\.(module|m).less$/;
26+
}
27+
2228
const styleLoader = require.resolve('style-loader');
2329

2430
const miniCss = MiniCssExtractPlugin.loader;
@@ -70,6 +76,13 @@ function getStyleLoader(options) {
7076
});
7177
}
7278

79+
if(isLess) {
80+
loaders.push({
81+
loader: require.resolve('less-loader'),
82+
options: { javascriptEnabled: true }
83+
});
84+
}
85+
7386
return {
7487
test: isModules ? styleModuleRegex : styleRegex,
7588
exclude: isModules ? '//' : styleModuleRegex,
@@ -145,10 +158,14 @@ module.exports.loaders = [
145158
getStyleLoader(),
146159
// Process Sass
147160
getStyleLoader({ sass: true }),
161+
// Process Less
162+
getStyleLoader({ less: true }),
148163
// Process Css Modules
149164
getStyleLoader({ modules: true }),
150165
// Process Sass Modules
151166
getStyleLoader({ sass: true, modules: true }),
167+
// Process Less Modules
168+
getStyleLoader({ less: true, modules: true }),
152169
{
153170
test: /\.svg$/,
154171
exclude: /[\\/]node_modules[\\/]/,

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
"html-webpack-plugin": "^4.0.0-beta.5",
5454
"identity-obj-proxy": "^3.0.0",
5555
"jest": "^23.6.0",
56+
"less": "^3.9.0",
57+
"less-loader": "^4.1.0",
5658
"loader-utils": "^1.2.3",
5759
"mini-css-extract-plugin": "^0.5.0",
5860
"node-sass": "^4.11.0",

template/src/App.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@color: #60dafb;
2+
3+
.less-success {
4+
color: @color;
5+
}

template/src/App.module.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@color: #60dafb;
2+
3+
.success {
4+
color: @color;
5+
}

template/src/App.module.less.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface IAppModuleLess {
2+
'success': string;
3+
}
4+
5+
export const locals: IAppModuleLess;
6+
export default locals;

template/src/App.tsx

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,34 @@ import fromCssModule from 'App.module.css';
1717
import 'App.scss';
1818
// Import sass modules
1919
import fromSassModule from 'App.module.scss';
20+
// Import less
21+
import 'App.less';
22+
// Import less modules
23+
import fromLessModule from 'App.module.less';
2024

2125
class App extends React.Component {
22-
public render() {
23-
return (
24-
<div className="App">
25-
<header className="App-header">
26-
<LogoSvg className="App-logo" />
27-
<h1 className="App-title">
28-
<Welcome>{welcomeMessage()}</Welcome>
29-
</h1>
30-
<div>
31-
<p className="sass-success">Style from Sass</p>
32-
<p className={fromCssModule.success}>Style from Css Modules</p>
33-
<p className={fromSassModule.success}>Style from Sass Modules</p>
34-
</div>
35-
</header>
36-
<p className="App-intro">
37-
To get started, edit <code>src/App.tsx</code> and save to reload.
38-
</p>
39-
</div>
40-
);
41-
}
26+
public render() {
27+
return (
28+
<div className="App">
29+
<header className="App-header">
30+
<LogoSvg className="App-logo" />
31+
<h1 className="App-title">
32+
<Welcome>{welcomeMessage()}</Welcome>
33+
</h1>
34+
<div>
35+
<p className="sass-success">Style from Sass</p>
36+
<p className="less-success">Style from Less</p>
37+
<p className={fromCssModule.success}>Style from Css Modules</p>
38+
<p className={fromSassModule.success}>Style from Sass Modules</p>
39+
<p className={fromLessModule.success}>Style from Less Modules</p>
40+
</div>
41+
</header>
42+
<p className="App-intro">
43+
To get started, edit <code>src/App.tsx</code> and save to reload.
44+
</p>
45+
</div>
46+
);
47+
}
4248
}
4349

4450
export default App;

0 commit comments

Comments
 (0)