【发布时间】:2017-02-15 16:18:06
【问题描述】:
我正在使用html-webpack-plugin 插件将<script> 标签注入到webpack 生成的块的模板文件中。我还有一些全局样式表,我想将它们动态添加到我的 HTML 模板的 <head> 部分。为此,我还使用 html-webpack-plugin 如下(在这种情况下,app entry/chunk 是相关的)。
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 搜索 templateUrl 和 styleUrls Angular 2 组件元数据中的声明并替换 带有相应 require 语句的路径。
问题在于,除了添加到 app.ts 入口点的两个样式表之外,webpack 还包含从我的 Angular2 组件引用的每个样式表。因为它遍历了应用程序的依赖,找到了angular2-template-loader添加的require语句。这是不可取的,因为我希望这些样式表对于它们所属的组件是本地的,即在 JS 中内联。
因此,我需要一种方法仅将我require 的样式表直接包含在我的入口点中,或许可以通过某种方式排除组件样式表。问题在于,在这两种情况下,文件都具有.css 扩展名,因此它们都通过了extract-text-plugin 的测试。我查看了加载程序/插件的文档,但找不到任何可以解决我的问题的内容。
所以我想要在我的模板文件中添加一个app.[contenthash].css 文件(这部分有效),但不包括在我的 Angular2 组件中引用的样式表(包括因为 angular2-template-loader )。
如何防止这些 Angular2 组件样式表包含在添加到我的 HTML 模板的样式表中?
【问题讨论】: