webpack用のLessローダーです。LessをCSSにコンパイルします。
まず、less
とless-loader
をインストールする必要があります
npm install less less-loader --save-dev
または
yarn add -D less less-loader
または
pnpm add -D less less-loader
次に、ローダーをwebpack
設定に追加します。例
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
// compiles Less to CSS
"style-loader",
"css-loader",
"less-loader",
],
},
],
},
};
そして、お好みの方法でwebpack
を実行します。
lessOptions
タイプ
type lessOptions = import('less').options | ((loaderContext: LoaderContext) => import('less').options})
デフォルト: { relativeUrls: true }
ローダーオプションのlessOptions
プロパティを介して、Less固有のオプションをless-loader
に渡すことができます。すべての利用可能なオプションについては、Lessドキュメントをdash-caseで参照してください。これらのオプションをプログラムでLessに渡しているので、ここでcamelCaseで渡す必要があります
object
オブジェクトを使用して、オプションをLessに渡します。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
{
loader: "style-loader",
},
{
loader: "css-loader",
},
{
loader: "less-loader",
options: {
lessOptions: {
strictMath: true,
},
},
},
],
},
],
},
};
function
ローダーコンテキストに基づいて、Lessに渡されるオプションの設定を可能にします。
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
lessOptions: (loaderContext) => {
// More information about available properties https://webpack.dokyumento.jp/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.less") {
return {
paths: ["absolute/path/c", "absolute/path/d"],
};
}
return {
paths: ["absolute/path/a", "absolute/path/b"],
};
},
},
},
],
},
],
},
};
additionalData
タイプ
type additionalData =
| string
| ((content: string, loaderContext: LoaderContext) => string);
デフォルト: undefined
実際のエントリファイルにLess
コードを先頭/末尾に追加します。この場合、less-loader
はソースをオーバーライドしませんが、エントリの内容を先頭に追加するだけです。
これは、Less変数のいくつかが環境に依存している場合に特に役立ちます
コードを注入しているため、これはエントリファイルのソースマッピングを壊します。多くの場合、複数のLessエントリファイルのように、これよりも簡単な解決策があります。
string
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
additionalData: `@env: ${process.env.NODE_ENV};`,
},
},
],
},
],
},
};
function
Sync
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
additionalData: (content, loaderContext) => {
// More information about available properties https://webpack.dokyumento.jp/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.less") {
return "@value: 100px;" + content;
}
return "@value: 200px;" + content;
},
},
},
],
},
],
},
};
Async
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
additionalData: async (content, loaderContext) => {
// More information about available properties https://webpack.dokyumento.jp/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.less") {
return "@value: 100px;" + content;
}
return "@value: 200px;" + content;
},
},
},
],
},
],
},
};
sourceMap
タイプ
type sourceMap = boolean;
デフォルト: compiler.devtool
の値に依存します
デフォルトでは、ソースマップの生成はdevtool
オプションに依存します。すべての値は、eval
とfalse
値を除くソースマップ生成を有効にします。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
},
},
{
loader: "less-loader",
options: {
sourceMap: true,
},
},
],
},
],
},
};
webpackImporter
タイプ
type webpackImporter = boolean;
デフォルト: true
デフォルトのwebpack
インポーターを有効/無効にします。
これにより、場合によってはパフォーマンスが向上する可能性があります。エイリアスとnode_modules
からの@import
は機能しないため、注意して使用してください。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
webpackImporter: false,
},
},
],
},
],
},
};
implementation
タイプ
type implementation = object | string;
Less 3および4バージョンと互換性のあるless-loader
特別なimplementation
オプションは、使用するLessの実装を決定します。ローカルにインストールされたpeerDependency
バージョンのless
を上書きします。
このオプションは、Less 3から4への移行を容易にするために、ダウンストリームツール作成者にとってのみ本当に役立ちます。
object
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
implementation: require("less"),
},
},
],
},
],
},
};
string
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
implementation: require.resolve("less"),
},
},
],
},
],
},
};
lessLogAsWarnOrErr
タイプ
type lessLogAsWarnOrErr = boolean;
デフォルト: false
Less
の警告とエラーは、単なるログではなく、webpackの警告とエラーになります。
warning.less
div {
&:extend(.body1);
}
lessLogAsWarnOrErr
がfalse
に設定されている場合、それは単なるログであり、webpackは正常にコンパイルされます。しかし、このオプションをtrue
に設定すると、webpackは警告を出してコンパイルに失敗します。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
"css-loader",
{
loader: "less-loader",
options: {
lessLogAsWarnOrErr: true,
},
},
],
},
],
},
};
less-loader
をcss-loader
とstyle-loader
とチェーンして、すべてのスタイルをすぐにDOMに適用します。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
{
loader: "style-loader", // creates style nodes from JS strings
},
{
loader: "css-loader", // translates CSS into CommonJS
},
{
loader: "less-loader", // compiles Less to CSS
},
],
},
],
},
};
残念ながら、Lessはすべてのオプションを1対1でキャメルケースにマッピングするわけではありません。不明な場合は、実行可能ファイルを確認し、ダッシュケースのオプションを検索してください。
CSSのソースマップを有効にするには、ローダーのオプションでsourceMap
プロパティを渡す必要があります。これが渡されない場合、ローダーはdevtool
で設定されたwebpackソースマップの設定を尊重します。
webpack.config.js
module.exports = {
devtool: "source-map", // any "source-map"-like devtool is possible
module: {
rules: [
{
test: /\.less$/i,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
},
},
{
loader: "less-loader",
options: {
sourceMap: true,
},
},
],
},
],
},
};
Chrome内で元のLessファイルを編集したい場合は、優れたブログ記事があります。このブログ記事はSassに関するものですが、Lessでも同様に機能します。
通常、MiniCssExtractPluginを使用して、スタイルシートを本番環境の専用ファイルに抽出することをお勧めします。こうすることで、スタイルがJavaScriptに依存しなくなります。
まず、組み込みのless
解決ロジックを使用しようとし、次にwebpack
解決ロジックを使用します。
webpack
は、ファイルを解決するための高度なメカニズムを提供します。less-loader
は、less
が@import
を解決できなかった場合、すべてのクエリをwebpackリゾルバーに渡すLessプラグインを適用します。したがって、node_modules
からLessモジュールをインポートできます。
@import "bootstrap/less/bootstrap";
~
を使用することは非推奨であり、コードから削除できます(**推奨**)。しかし、歴史的な理由から、まだサポートしています。なぜ削除できるのでしょうか?ローダーはまず、相対として@import
を解決しようとします。解決できない場合、ローダーはnode_modules
内で@import
を解決しようとします。
デフォルトのリゾルバーオプションは、resolve.byDependency
で変更できます。
webpack.config.js
module.exports = {
devtool: "source-map", // any "source-map"-like devtool is possible
module: {
rules: [
{
test: /\.less$/i,
use: ["style-loader", "css-loader", "less-loader"],
},
],
},
resolve: {
byDependency: {
// More options can be found here https://webpack.dokyumento.jp/configuration/resolve/
less: {
mainFiles: ["custom"],
},
},
},
};
paths
オプションを指定した場合、モジュールは指定されたpaths
で検索されます。これはless
のデフォルトの動作です。paths
は絶対パスの配列である必要があります。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.less$/i,
use: [
{
loader: "style-loader",
},
{
loader: "css-loader",
},
{
loader: "less-loader",
options: {
lessOptions: {
paths: [path.resolve(__dirname, "node_modules")],
},
},
},
],
},
],
},
};
プラグインを使用するには、次のようにplugins
オプションを設定するだけです。
webpack.config.js
const CleanCSSPlugin = require('less-plugin-clean-css');
module.exports = {
...
{
loader: 'less-loader',
options: {
lessOptions: {
plugins: [
new CleanCSSPlugin({ advanced: true }),
],
},
},
},
...
};
注記
カスタムプラグイン内のローダーコンテキストへのアクセスは、
pluginManager.webpackLoaderContext
プロパティを使用して行うことができます。
module.exports = {
install: function (less, pluginManager, functions) {
functions.add("pi", function () {
// Loader context is available in `pluginManager.webpackLoaderContext`
return Math.PI;
});
},
};
webpackでCSSをバンドルすることには、ハッシュ化されたURLを持つ画像やフォントを参照したり、開発でホットモジュールリプレースメントを使用したりするなど、いくつかの利点があります。一方、本番環境では、JSの実行に依存してスタイルシートを適用するのは良い考えではありません。レンダリングが遅れたり、FOUCが表示されたりする可能性があります。したがって、最終的な本番ビルドでそれらを別々のファイルとして持つ方が依然として優れていることがよくあります。
バンドルからスタイルシートを抽出する方法は2つあります。
extract-loader
(よりシンプルですが、css-loaderの出力に特化しています)MiniCssExtractPlugin
(より複雑ですが、すべてのユースケースで機能します)LessとCSSモジュールには、url(...)
ステートメントの相対ファイルパスに関する既知の問題があります。説明については、このissueを参照してください。
まだお読みでない場合は、貢献ガイドラインを読む時間を取ってください。