我正在使用 html-webpack-plugin 插件将 webpack 生成的代码块注入到模板文件中。此外,我还有一些全局样式表,希望能够动态地添加到 HTML 模板的 <head>
部分中。为此,我也使用了 html-webpack-plugin 插件(在这种情况下,app
入口/代码块是相关的)。
module.exports = {
entry: {
'polyfills': './ts/polyfills.ts',
'vendor': './ts/vendor.ts',
'app': './ts/app.ts'
},
module: {
loaders: [
{
test: /\.ts$/,
loaders: ['ts', 'angular2-template-loader']
},
{
test: /\.html$/,
loader: 'html-loader'
},
{
test: /\.css$/,
loaders: ['to-string-loader', ExtractTextPlugin.extract('style-loader', 'css-loader')]
}
]
},
plugins: [
new ExtractTextPlugin('css/[name].[contenthash].css'),
new webpack.ProvidePlugin({
bootstrap: 'bootstrap'
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
filename: 'js/[name].[chunkhash].min.js',
chunks: ['app']
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: 'js/[name].[chunkhash].min.js',
chunks: ['vendor']
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'polyfills',
filename: 'js/[name].[chunkhash].min.js',
chunks: ['polyfills']
}),
new HtmlWebpackPlugin({
template: 'my-template.html',
filename: 'my-template.html',
inject: 'body',
hash: false
}),
]
};
以下是 app.ts
文件,我在其中添加了require
语句以引入我想要包含在模板中的每个样式表(它们被合并为一个单独的样式表)。
require('main.css');
require('misc.css');
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
基本上这个方法很好用,但它有一个限制,因为我使用的是 Angular2 应用程序,该应用程序由组件组成,这些组件可能具有相关联的样式表,就像这个例子中。
@Component({
styleUrls: [
'my-stylesheet.css'
]
})
export class MyComponent { ... }
通常情况下,构建应用程序会导致为组件的样式表进行大量的HTTP调用,因此为了解决这个问题,我使用angular2-template-loader将样式表直接拉入组件中。该加载器的工作原理如下:
但是这样做的问题在于,除了添加到angular2-template-loader在Angular 2组件元数据中搜索templateUrl和styleUrls声明,并将路径替换为相应的require语句。
app.ts
入口点的两个样式表之外,webpack还包括从我的Angular2组件引用的每个样式表。因为它通过应用程序的依赖项并找到由angular2-template-loader添加的require
语句。这是不可取的,因为我希望这些样式表是属于它们所属的组件的本地样式表,即内联在JS中。因此,我需要一种方法来仅包含我在入口点中直接
require
的样式表,也许是通过某种方式排除组件样式表。问题在于,在这两种情况下,文件都具有.css
扩展名,因此它们都通过了extract-text-plugin
的测试。我查看了加载器/插件的文档,但找不到可以解决我的问题的东西。因此,我想要的是在模板文件中添加
app.[contenthash].css
文件(这部分有效),但是排除由于angular2-template-loader而引用的样式表。我该如何防止将这些Angular2组件样式表包含在添加到我的HTML模板中的样式表中?
public/css
,而组件的样式表位于public/css/components/**/*.css
。我尝试在第一个加载器中排除/public\/css\/components/
,并在第二个加载器中使用raw
,以及进行了许多不同的测试和排除,但出现了各种不同的错误。我不确定是路径/正则表达式出了问题还是其他问题。如果您能提供一个带有上述路径的示例,那真的太棒了,因为我似乎无法让它正常工作。 - ba0708/public\\css\\components/
或者/css\\components/
。 - yurzui