如何从 webpack angular2 应用程序中的 node_modules 导入 CSS

新手上路,请多包涵

假设我们从以下启动包开始: https ://github.com/angularclass/angular2-webpack-starter

npm installnpm run start 之后一切正常。

我想添加一个外部 css 模块,例如 bootstrap 4 的 css(并且只有 css)。 (我知道 bootstrap 有一个 bootstrap-loader,但现在我要的是通用解决方案,所以请在这里考虑 bootstrap 4,因为它可能是通过 npm 可用的任何其他 css 模块)。

我通过 npm 安装引导程序: npm install bootstrap@4.0.0-alpha.4 --save

首先我认为在 vendor.browser.ts 文件中添加 import 'bootstrap/dist/css/bootstrap.css'; 就足够了。

但事实并非如此。

我应该怎么做才能有适当的解决方案?

我不要求的解决方案:

  1. “将外部 css 模块复制到资产文件夹,并从那里使用它”
    • 我正在寻找与 npm 包一起使用的解决方案。
  2. “为 webpack 使用 bootstrap-loader”
    • 如上所述,我正在寻找一个通用的解决方案,bootstrap 在这里只是一个示例。
  3. “使用另一个堆栈”
    • 我正在寻找我上面提到的确切入门包中的解决方案。

原文由 Burnee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 715
2 个回答

如果不进行一些更改,您将无法使用该堆栈将任何 CSS 导入您的 供应商 文件。

为什么?好吧,因为这一行:

 import 'bootstrap/dist/css/bootstrap.css';

它只是将您的 css 作为字符串导入,而实际上您想要的是样式标签中的供应商 css。如果你检查 config/webpack.commons.js 你会发现这个规则:

  {
   test: /\.css$/,
   loaders: ['to-string-loader', 'css-loader']
 },

此规则允许您的组件导入 css 文件,基本上是这样的:

 @Component({
  selector: 'app',
  encapsulation: ViewEncapsulation.None,
  styleUrls: [
    './app.component.css' // this why you import css as string
  ],

在 AppComponent 中没有封装,因为这一行 encapsulation: ViewEncapsulation.None, 这意味着任何 CSS 规则都将全局应用于您的应用程序。所以你可以在你的应用组件中导入引导样式:

 @Component({
  selector: 'app',
  encapsulation: ViewEncapsulation.None,
  styleUrls: [
    './app.component.css',
    '../../node_modules/bootstrap/dist/css/bootstrap.css'
  ],

但是如果你坚持导入到你的 vendor.ts 那么你需要安装一个新的加载器, npm i style-loader --save-dev 这将允许 webpack 将 css 注入你的页面。然后,您需要在 webpack.common.js 上创建一个特定规则并更改现有规则:

  { //this rule will only be used for any vendors
   test: /\.css$/,
   loaders: ['style-loader', 'css-loader'],
   include: [/node_modules/]
 },
 {
   test: /\.css$/,
   loaders: ['to-string-loader', 'css-loader'],
   exclude: [/node_modules/] //add this line so we ignore css coming from node_modules
 },

第一条规则仅在您尝试从 node_modules 中的任何包导入 css 时应用,第二条规则将适用于您从 node_modules 之外导入的任何 css

原文由 Fabio Antunes 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 styles.css 文件上使用 @import '~bootstrap/dist/css/bootstrap.css'; 是可能的。 (注意 ~

编辑:它是如何工作的——“~”是在指向资产文件夹的 webpack 配置上设置的别名……就这么简单……

编辑 2:关于如何使用“~”别名配置 webpack 的示例…这应该在 webpack 配置文件中进行(通常 webpack.config.js )…

 // look for the "resolve" property and add the following...
// you might need to require the asset like '~/bootsrap/...'
resolve: {
  alias: {
    '~': path.resolve('./node_modules')
  }
}

原文由 Anderson Ivan Witzke 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题