TL; DR:私の質問は私のsassファイルのいくつかを単一のsassファイルにバンドルする方法ですか?
私はAngularコンポーネントライブラリを開発していて、それをng-packagrでパッケージ化しました。それを@my-lib/ngx-components
と呼びましょう。
私のlibのコンシューマーは、@my-lib/ngx-components/navbar
のような私のコンポーネントをインポートします。
コンポーネントにテーマサポートを追加することにしました。
たとえば、デフォルトの色(背景、テキスト、ホバーなど)のナビゲーションバーコンポーネントがあります。ライブラリの利用者がこれらの色を独自のテーマで上書きできるようにしたいです。そのため、$theme
入力を受け取りいくつかのcssルールを次のようにオーバーライドするmixin
を作成しました(これは私が持っているものの基本バージョンです)
_navbar-theme.sass
@mixin navbar-theme($theme)
$primary-color: map-get($theme, primary-color)
$secondary-color: map-get($theme, secondary-color)
$color: map-get($theme, color)
.navbar
background-color: $primary-color
color: $color
&:hover
background-color: $secondary-color
各コンポーネントには、独自の*-theme.sass
ファイルがあります。
次のようにこれらすべてをインポートするグローバル_theming.sass
ファイルもあります
_theming.sass
@import './components/navbar/navbar-theme'
@import './components/button/button-theme'
@import './components/dropdown/dropdown-theme'
この_theming.sass
ファイルをライブラリからエクスポートしたいので、人々はこのファイルを自分のsass
ファイルに@import '~@my-lib/ngx-components/theming'
としてインポートし、利用可能なすべてのmixin
を使い始めることができます。 。カスタムのnavbar
、button
などが必要な場合は、それらのmixin
sを1回のインポートで使用できる必要があります。
角度のあるマテリアルのテーマ設定のように見せようとしました。
最初は、すでに依存関係にあるnode-sass
を試しました。ただし、sassをcssにビルドしようとするため、出力ファイルでミックスインが省略されます。
次に、Angular-Materialが何をしたかを調べました。彼らは scss-bundle を使用します
「まさにこれが欲しい」と思いました。ただし、scss
ファイルではなく、sass
ファイルが必要です。 sass
ファイルを読み取ることはできません。
それで、「さて、sassをあきらめてscssを使い始めることができます。これらのファイルをすべて手動で処理せずにscssに変換するにはどうすればよいですか」と思いました。次に、 sass-convert を見つけました。 この質問では コマンドラインで使用できると言われました。ただし、npmを使用してsass-convert
をグローバルにインストールすると、コマンドライン実行可能ファイルが表示されませんでした。使用するにはGulp
が必要だと思います。
私は最初からGulp
を使用することを避けてきました。これは、学習するための別のツールを意味し、コードベースを複雑にするためです。
この時点で、私は "Hal固定電球" のように感じます
TL; DR:私の質問は私のsassファイルのいくつかを単一のsassファイルにバンドルする方法ですか?
また、webpackを必要とするソリューションを思い付くことができれば、それも問題ありません。
あなたの意見や質問を見てみましょう:
この_theming.sassファイルを自分のlibからエクスポートしたいので、人々はこのファイルを自分のsassファイルに@ import'〜 @ my-lib/ngx-components/theming 'としてインポートし、利用可能なすべてのミックスインの使用を開始できます。カスタムナビゲーションバー、ボタンなどが必要な場合は、それらのミックスインを1回のインポートで使用できる必要があります。
あなたは、あなたのターゲットオーディエンスが何であるかを知る必要があります。ほとんどの場合、テンプレートスクラッチのようにアプリを作成するためにangular cliを使用します。
したがって、css
バンドル(人々はあなたのcssをインポートしたいだけです)とsass
バンドル(あなたのオブジェクトまたはあなたのミックスインを使いたい人)を提供する必要があります。
この_theming.sassファイルをライブラリからエクスポートしたいので、人々はこのファイルを自分のsassファイルに@ import'〜 @ my-lib/ngx-components/theming 'としてインポートし、利用可能なすべてのミックスインの使用を開始できます。カスタムナビゲーションバー、ボタンなどが必要な場合は、それらのミックスインを1回のインポートで使用できる必要があります。
角度のあるマテリアルのテーマ設定のように見せようとしました。
まず、@angular/material
はsass
をエクスポートしない(scssを使用する)が、scss-bundle
によってコンパイルされたcsstheneをエクスポートすることを知っておく必要があります(あなたが言うように) コード およびドキュメント テーマ 。
「まさにこれが欲しい」と思いました。ただし、sassファイルではなくscssファイルが必要です。 sassファイルを読み取ることはできません。
これを引用したい answer :
Sassは、構文が進歩したCSSプリプロセッサです。高度な構文のスタイルシートはプログラムによって処理され、通常のCSSスタイルシートに変換されます。ただし、CSS標準自体を拡張するものではありません。
コードをsassからscssに(自分で)転送する必要がある方が良いです、それはそれほど多くはありません(私はいつもsassファイルの代わりにscssを書くと思います)。
コンポーネントライブラリを提供するときは、css
とscss
を提供する必要があります。 Beacuse angular cliはデフォルトでscss
ローダーを提供しません。
sass
ファイルを使用しないでください。scss
ファイルを使用してください。上の私の参照回答を参照してください。
scss-バンドル+ webpack
Cssを提供する必要があるため、scssをバンドルすることができます webpack Shell plugin 。 cliを使用したい場合は、Scssがcliを提供しています。
さて、この場合のbootstrap @ 4モジュールからサンプルを取りましょう。 Bootstrap次のような構造を使用します( Documents ):
scss
|-- _variables.scss
|-- _mixins.scss
|-- _functions.scss
|-- ...
|-- index.scss
index.scss
内は次のようになります:
@import 'variables'
@import 'mixins'
@import 'functions'
...
したがって、このscss
は、css
の横に配信する必要があります。 bootstrap
と同様に、消費者はmixin
を利用できます。また、コンシューマーがscss
フォルダー内のscss
ファイルを見つける場合のこの優れたアプローチ(scssが挿入されているものを簡単に指定できます)。
単一ファイルにバンドルするには、それを行うためのタスクランナーを作成する必要があります。 webpackを使用したい場合は、プラグインを作成して使用できます。
ここにプラグインの例があります:
configwebpackを呼び出します。
plugins: [
new webpack.NoEmitOnErrorsPlugin(),
new SCSSBundlePlugin({
file: path.join(__dirname, 'src/index.scss')
})
],
遊び場を試すには、チェックアウト hello-world-loader then:
# install dependency
npm install
# try play ground
npm run webpack
_theme.scss
にファイル./dist
を作成します。
私のアドバイスでは、webpackを使用せず、この単純なケースでは代わりにタスクランナー(gulpまたはgrunt)を使用してください。 Webpackは進歩しすぎて、タスクを書くのが難しい。
scss-bundle と呼ばれる広く使用されているパッケージもあります。
使い方はとても簡単です。関連するすべての設定を含む設定ファイルを作成してから、scss-bundleを実行するだけです。
たとえば、これは、entry.scssにインポートされたすべてのscssファイルを使用し、それをout.scssに移動します。 @import '~@angular/material/theming';
のようなangularこの例のテーマを除いて、すべてのインポートが解決されます。
scss-bundle.config.json:
{
"bundlerOptions": {
"entryFile": "my-project/src/entry.scss",
"outFile": "dist/out.scss",
"rootDir": "my-project/src",
"project": "../../",
"ignoreImports": [
"~@angular/.*"
],
"logLevel": "debug"
}
}
scss/sassファイルのソリューション小さなモジュールを使用しました bundle-scss
ファイル名マスクでファイルをバンドルします。したがって、./src/**/*.theme.scss
のような正しいマスクを渡す必要があります。宛先ファイルと、場合によってはカスタムの並べ替え順序を指定します。
すべてのインポートで1つのエントリポイントファイルを作成する必要はありません。 bundle-scss
は、すべてのインポートをマスク分析してすべてのファイルを取得し、このファイルも含めます