我創建了一個加載器,它可以將加載文件的內容附加或替換爲其名稱中所選主題標題的兄弟內容。
TL; DR
- 創建裝載機的文件。
- 在webpack配置中使用它。
- 在THEME中運行webpack = <themeName> evironment。
主題loader.js
const fs = require('fs');
const loaderUtils = require('loader-utils');
module.exports = function (mainData) {
const options = loaderUtils.getOptions(this);
let themeName = options.theme;
let mode = options.mode;
if (themeName) {
// default mode
if (!Object.keys(transform).includes(mode)) {
mode = 'replace';
}
// fileName.suffix.ext -> fileName.suffix.themeName.ext
const themeAssetPath = this.resourcePath.replace(/\.([^\.]*)$/, `.${themeName}.$1`);
const callback = this.async();
// for HMR to work
this.addDependency(themeAssetPath);
fs.readFile(themeAssetPath, 'utf8', (err, themeData) => {
if (!err) {
callback(null, transform[mode](mainData, themeData));
} else if (err.code === 'ENOENT') {
// don't worry! if it's not here then it's not needed
callback(null, mainData);
} else {
callback(err);
}
});
} else {
return mainData;
}
};
const transform = {
// concat theme file with main file
concat: (mainData, themeData) => mainData + '\n' + themeData,
// replace main file with theme file
replace: (mainData, themeData) => themeData
};
一片樣品webpack.config.js使用此手工裝載機:
resolveLoader: {
modules: [
paths.libs, // ./node_modules
paths.config // this is where our custom loader sits
]
},
module: {
rules: [
// component styles
{
test: /\.css$/,
include: path.join(paths.src, 'app'),
use: [
'raw-loader',
// search for a themed one and append it to main file if found
{
loader: 'theme-loader',
options: {
theme: process.env.THEME,
mode: 'concat'
}
}
]
},
// angular templates — search for a themed one and use it if found
{
test: /\.html$/,
use: ['raw-loader',
{
loader: 'theme-loader',
options: {
theme: process.env.THEME,
mode: 'replace'
}
}
]
}
]
}
例如, app.component.css:
:host {
background: #f0f0f0;
color: #333333;
padding: 1rem 2rem;
display: flex;
flex-direction: column;
flex: 1;
justify-content: center;
}
nav {
/* ... */
/* something about nav element */
/* ... */
}
header {
/* ... */
/* pile of styles for header */
/* ... */
}
要實現深色主題,我們不需要更改所有flex和填充工作人員,也許nav和header沒有自己的背景和字體顏色設置。所以我們只需要重寫主機元素樣式。我們創建app.component.dark.css:
:host {
background: #222222;
color: #e0e0e0;
}
的,我們設定爲黑暗的環境變量主題的WebPack運行。加載程序需要處理app.component.css,試圖加載app.component.dark.css並且瞧!主題的css被附加到結果文件的末尾。由於級聯的,
如果多用戶競爭選擇具有相同的重要性和特殊性,...後面的規則將贏得比早期規則(MDN)。
對於HTML我們沒有這樣的方法。所以我們必須完全重寫我們的模板。希望你不需要經常這樣做。我的情況是,我想要改變頁眉和頁腳以適應客戶的品牌需求。
這是我第一次嘗試創建一個webpack loader,如果您發現問題,請留下評論。
幫我更換資產很多。必須禁用raw-loader才能使用默認加載器。 (行結束問題) – feskr