我有这个工作与编写自定义的“解析”:
const ThemeResolver = {
apply: function(resolver) {
resolver.plugin('file', function(req, cb) {
if (req.request.indexOf('[theme]') == -1) {
return cb();
}
const defaultFile = req.request.replace('[theme]', 'Default');
const themedFile = req.request.replace('[theme]', process.env.THEME);
req.request = themedFile;
this.doResolve(['file'], req, (err) => {
if (!err) {
return cb();
}
req.request = defaultFile;
this.doResolve(['file'], req, cb);
})
});
}
};
module.exports = {
// ...
plugins: [
new webpack.ResolverPlugin([ThemeResolver]),
]
// ...
};
它试图解决在其路径[theme]
文件与定义为环境变量为主题的路径。如果失败,它会回退到默认文件。这样我可以要求主题的文件,像这样:
import Presentation from './button-[theme]'
主要成分竟然是比我的问题有点不同,但我实际上是相当知足吧:
import React from 'react';
import Presentation from './button-[theme]';
export default class Button extends React.Component {
onClick = (e) => console.log('some logic');
render() {
return <Presentation onClick={ this.onClick } />;
}
}
此按钮组分可以活的button.core.jsx
内所述的逻辑,而呈现将由这些组分之一进行处理:
THEME=theme-a npm start // button-[theme] resolves to button-theme-a.jsx
THEME=theme-c npm start // button-[theme] resolves to button-default.jsx
免责声明:我没有在大规模或生产环境中使用它,但它似乎在小型POC中起作用。请让我知道,如果我做了一件不明智的事情!
我遇到了这个问题。其他插件似乎没有看到它。所以,就我而言,使用'html-webpack-plugin'作为favicon,它永远不会解析主题标签。 – Ben
这实际上是有意义的,因为你不需要/导入任何东西。你只是做一个参考,你的浏览器将加载图标。你不能在模板中添加一些逻辑吗? – Jpunt
这可能是我会做的。将上面的“我的品牌文件存在”代码模块化,以便我可以在解析器之外使用它。 – Ben