加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在webpack中使用ExtractTextPlugin忽略Angular2组件样式表

发布时间:2020-12-17 17:42:09 所属栏目:安全 来源:网络整理
导读:我正在使用 html-webpack-plugin插件注入 script标记到webpack生成的块的模板文件中.我还有一些全局样式表,我想动态添加到 head我的HTML模板的一部分.为此,我也使用html-webpack-plugin如下(在这种情况下,app entry / chunk是相关的). module.exports = { en
我正在使用 html-webpack-plugin插件注入< script>标记到webpack生成的块的模板文件中.我还有一些全局样式表,我想动态添加到< head>我的HTML模板的一部分.为此,我也使用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',chunks: ['vendor']
        }),new webpack.optimize.CommonsChunkPlugin({
            name: 'polyfills',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将样式表直接拖到组件中.此加载器的工作原理如下.

The angular2-template-loader searches for templateUrl and styleUrls
declarations inside of the Angular 2 Component metadata and replaces
the paths with the corresponding require statement.

这个问题是除了添加到app.ts入口点的两个样式表之外,webpack还包括从我的Angular2组件引用的每个样式表.因为它遍历应用程序的依赖项并找到由angular2-template-loader添加的require语句.这是不可取的,因为我希望这些样式表对于它们所属的组件是本地的,即在JS中内联.

因此,我需要一种方法,只在我的入口点中包含我需要的样式表,可能以某种方式排除组件样式表.问题是,在这两种情况下,文件都具有.css扩展名,因此它们都通过了extract-text-plugin的测试.我看了一下加载器/插件的文档,但我找不到任何可以解决我问题的东西.

所以我想要的是将一个app.[contenthash] .css文件添加到我的模板文件中(这部分可以工作),但不包括我的Angular2组件中引用的样式表(包括因为angular2-template-loader).

如何防止这些Angular2组件样式表包含在添加到我的HTML模板的样式表中?

解决方法

假设您有以下文件夹结构:

enter image description here

所以我的所有组件都位于app文件夹中.

main.ts

require('main.css');
require('misc.css');

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

/app/app.component.ts

@Component({
  selector: 'my-app',template: `<h1>My Angular 2 App</h1>`,styleUrls: ['my-stylesheet.css']
})
export class AppComponent {}

那你的解决方案可能如下所示:

webpack.config.js

{
  test: /.css$/,exclude: /app.+.css$/,<== add this (exclude all styles from app folder)
  loaders: ['to-string-loader','css-loader')]
},{
  test: /app.+.css$/,loader: 'raw'  <== use raw loader for these files
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读