質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SCSS

SCSSは、SassのCSSメタ言語です。Webページのスタイルを指定するCSSを効率的に記述することができます。ネストと呼ばれる入れ子構造で記述するため、CSSの全体の記述量を減らせる点が特徴です。さらに変数も利用できるため、変更や修正の際に少ない作業量で対応することもできます。

Q&A

0回答

1572閲覧

Scssコンパイル、webpackの設定について

momujin

総合スコア0

SCSS

SCSSは、SassのCSSメタ言語です。Webページのスタイルを指定するCSSを効率的に記述することができます。ネストと呼ばれる入れ子構造で記述するため、CSSの全体の記述量を減らせる点が特徴です。さらに変数も利用できるため、変更や修正の際に少ない作業量で対応することもできます。

0グッド

0クリップ

投稿2021/07/08 02:18

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
webpack5系でpug、scssが利用できる静的ページのテンプレートを
作成しようと考えています。
ビルド実行時にscssの変数・関数が定義されていないとのエラーが発生します。
変数定義が関係ないscssファイルのimportは、問題ないのですが
_variables.scss、_mixin.scssのimportに問題が発生しているようです。

webpackの設定、loader,pluginの導入などでの解決策は何かありますでしょうか?

発生している問題・エラーメッセージ

エラーメッセージ ERROR in ./src/styles/style.scss Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js): ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): SassError: Undefined variable.

webpack.config.js

// 絶対パスを取得する為にpathモジュールを利用 const path = require('path'); // CSSを別ファイルとして出力するプラグイン const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // ビルドしたファイル(css,js)を含んだhtmlファイルを自動で出力するプラグイン const HtmlWebpackPlugin = require('html-webpack-plugin'); // 不要ファイルを自動的に削除するプラグイン const{}の形で記述するのは、clean-webpack-pluginに // 含まれる機能からcleanWebpackPlugin機能のみを利用するから。 const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // 作業フォルダ内のファイル検索・取得を行うプラグイン const globule = require('globule'); const app = { // モードの設定 mode: 'development', target: 'web', // ソースマップの出力設定(複数の出力タイプが用意されている) devtool: "source-map", // node_modules を監視(watch)対象から除外 watchOptions: { ignored: /node_modules/ //正規表現で指定 }, // エントリーポイントの設定 entry: './src/scripts/main.js', // 出力の設定 output: { // 出力先パス(絶対パス) path: path.resolve(__dirname, './dist'), // 出力ファイル名(元ファイル名+ハッシュ) filename: 'scripts/[name]-[contenthash].js', publicPath: '/', }, // 開発用ローカルサーバーの設定 devServer: { // サーバーの起点ディレクトリ(dist) contentBase: path.join(__dirname, './dist'), // デフォルトでは、localhost // 0.0.0.0に設定すると同一ネットワーク内のスマホなどから、http://自分のパソコンのIPアドレス:8080/でアクセスできる //host: "0.0.0.0", // サーバー起動時にブラウザを開くかどうか open: true, // port設定 デフォルトは8080 //port: 8090 }, // webpackの詳細ログ出力 // stats: { // children: true, // }, module: { rules: [ { test: /.js$/, // node_modules以下のファイルは除外 exclude: /node_modules/, use: [ { // Babel を利用する loader: 'babel-loader', // Babel のオプションを指定する options: { // プリセットを指定することで、ES2020 を ES5 に変換 presets: [ [ // 使用するプリセットの指定 "@babel/preset-env", { // useBuiltInsオプションで 'usage' と設定するとコードを解析し、必要なpolyfillを // corejsから自動でimportする。 useBuiltIns: 'usage', // corejsのバージョン指定 corejs: 3 } ] ] }, }, ], }, { // ローダーの処理対象ファイル test: /.(css|scss|sass)$/, // ルール設定(loaderの適用は下から上の順) use: [ { // CSSを別ファイルとして出力するように MiniCssExtractPlugin のローダーを設定 loader: MiniCssExtractPlugin.loader, }, { // CSSをバンドルするためのローダー loader: 'css-loader', options: { // URLの解決を無効設定 (元ファイルのurl() メソッドは変換されずに出力される) url: false, // ソールマップを有効に sourceMap: true, // css loaderの前に適用するloaderの数を設定 importLoaders: 2, // 0 => no loaders (default); // 1 => postcss-loader; // 2 => postcss-loader, sass-loader }, }, { // PostCSS(autoprefixer、postcss-sort-media-queries)の設定 loader: 'postcss-loader', options: { postcssOptions: { plugins: [ // ベンダープレフィックスを自動付与 ターゲットブラウザは.browserslistrcで設定 // css gridへの対応はここで設定 require("autoprefixer")({ grid: true }), // メディアクエリの統合 ( mobile-first でソート ) require("postcss-sort-media-queries")({ sort: 'mobile-firstl' }), ], }, // PostCssでもソールマップを有効に sourceMap: true, }, }, { // SassをCSSへ変換するローダー loader: 'sass-loader', options: { // dart-sassを優先 sassOptions: { // fibersパッケージを読み込み fiber: require('fibers'), }, // ソールマップを有効に sourceMap: true, }, }, { // Sassのimportをまとめるローダー loader: 'import-glob-loader', }, ] }, { // ローダーの処理対象ファイル test: /.(gif|png|jpe?g|svg)$/i, // webpack5の Asset Modules 設定 type: 'asset/resource', // 出力設定 generator: { // [name]はオリジナルのファイル名、[ext]はオリジナルの拡張子 filename: 'images/[name]-[contenthash][ext]' }, use: [ { // PNG, JPEG, GIF, SVG, WEBPの画像圧縮ができるloader loader: 'image-webpack-loader', options: { // jpgの圧縮設定 mozjpeg: { progressive: true, quality: 65, }, // pngの圧縮設定 pngquant: { quality: [0.80, 0.90], }, } } ], }, { // ローダーの処理対象ファイル test: /.pug/, // 除外ファイル exclude: /node_modules/, use: [ { // html-loaderで imgのsrc属性が処理されるのでrequire()の記述が削除できる。 loader: 'html-loader', }, { // .pugのファイルを.htmlに変換 loader: 'pug-html-loader', options: { // 改行オプション pretty: true, } } ] } ] }, // プラグイン設定 plugins: [ // distディレクトリのファイルをビルド時に一旦削除 new CleanWebpackPlugin({ }), // バンドルしたCSSを別ファイルとして出力するプラグイン new MiniCssExtractPlugin({ // 出力ファイル名設定(dist/scripts/mian.jsからの相対パス style-ハッシュ値.css) filename: './styles/style-[contenthash].css' }), ] } // app end // globuleパッケージで .pugファイルを配列に格納 const templates = globule.find('./src/templates/*.pug', { ignore: ['./src/templates/**/_*.pug'] }) // .pugファイルの分、HtmlWebpackPluginを発火 templates.forEach((template) => { const fileName = template.replace('./src/templates/', '').replace('.pug', '.html') app.plugins.push( new HtmlWebpackPlugin({ filename: `${fileName}`, template: template, }) ) }) module.exports = app

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問