angular - Angular 2 的 webpack 中的 ExtractTextPlugin

标签 angular webpack extract-text-plugin

我有一个用于 Angular 的 webpack 的工作配置,以便将 scss 文件插入到 bundle.js 中

{
  test: /\.scss$/,
  use: ['raw-loader', 'resolve-url-loader', 'sass-loader?sourceMap']
}

但是后来我想获取一个包含应用程序中所有 scss 的单个 css 文件,所以我使用这样的 ExtractTextPlugin

{
  test: /\.scss$/,
  use: ExtractTextPlugin.extract({
    fallback: ['raw-loader', 'resolve-url-loader', 'sass-loader?sourceMap'],
    use: ['resolve-url-loader', 'sass-loader?sourceMap']
  })
}

现在,我没有使用“raw-loader”,因为我知道这些文件不必插入到 bundle.js 中,但我在编译时遇到错误。

ERROR in ./~/resolve-url-loader!./~/sass-loader/lib/loader.js?sourceMap!./app/app.component.scss
    Module parse failed: /Users/david/Documents/work/my-angular-seed/node_modules/resolve-url-loader/index.js!/Users/david/Documents/work/my-angular-seed/node_
modules/sass-loader/lib/loader.js?sourceMap!/Users/david/Documents/work/my-angular-seed/app/app.component.scss Unexpected token (1:0)
    You may need an appropriate loader to handle this file type.
    | .app {
    |   border: 1px solid red;
    | }

如果我使用 raw-loader,构建会很顺利,但在加载 index.html 时出现错误

Uncaught Error: Expected 'styles' to be an array of strings.

有谁知道如何解决这个问题以及为什么会这样? 谢谢!

编辑

我检查了更多,我想我知道问题出在哪里,但我不知道如何解决。

如果我使用这个配置

{
  test: /\.scss$/,
  use: ExtractTextPlugin.extract({
    fallback: 'style-loader',
    use: ['css-loader', 'sass-loader']
  })
}

app.css 已生成,一切正常。但是如果我检查 bundle.js 组件已经转换成这个

AppComponent = __decorate([
    core_1.Component({
        selector: 'app-root',
        styles: [__webpack_require__(23)],
        template: "\n    <div class=\"app\">\n      Hello!\n    </div>\n  "
    })
], AppComponent);

如果我检查模块 23,我发现它是空的

/* 23 */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

所以我猜这就是 angular 所提示的,styles 是一个空数组。我认为这里应该做的是完全删除样式标签,因为 css 被用作外部分隔文件,对吗?有办法解决这个问题吗?

最佳答案

您可以使用 css-loader , 通常用于 raw-loader对于 CSS。和 fallback是在不提取 CSS 时使用的加载程序(如 extract options 中所述)。除了 style-loader,我想不出任何其他用途,这会将 CSS 插入到 <style> 中标签。您在 use 中指定的加载器在此之前仍然适用,因此使用 raw-loader不会有任何影响。

你会改变 .scss这个常见的规则(类似于 Extracting Sass 中的示例):

{
  test: /\.scss$/,
  use: ExtractTextPlugin.extract({
    fallback: 'style-loader',
    use: ['css-loader', 'resolve-url-loader', 'sass-loader?sourceMap']
  })
}

如果您不想要 style-loader作为后备方案,您可以将其关闭,如果未提取 CSS,CSS 仍将位于 bundle 中,只是不会注入(inject)到 <style> 中。标记,但这可能对您没有帮助。

关于angular - Angular 2 的 webpack 中的 ExtractTextPlugin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589756/

相关文章:

javascript - 如何使用 Webpack 4 公开 javascript 模块的默认导出对象?

javascript - 提取文本 Webpack 插件不会生成工件

javascript - Webpack提取文本插件未知单词导出错误

angular - 从 Angular 中的 get Http 请求获取 header

Angular 2 form reset()不重置值_submitted或submitted

angular - 将不同的上下文传递给 ngIf

angular - 使用导出 const 变量的 Webpack treeshaking

webpack - htmlWebpackPlugin 只为生成的html添加一个入口点

node.js - 错误 : TSError: ⨯ Unable to compile TypeScript

webpack - 如何从每个条目中提取关键(首屏)CSS?