How to import CSS from node_modules in webpack angular2 app

后端 未结 3 483
抹茶落季
抹茶落季 2021-01-30 06:20

Let\'s say that we start with the following starter pack: https://github.com/angularclass/angular2-webpack-starter

After npm install and npm run start

相关标签:
3条回答
  • 2021-01-30 06:56

    It is possible by using @import '~bootstrap/dist/css/bootstrap.css'; on the styles.css file. (Note the ~)

    Edit: How it works - The '~' is an alias set on the webpack config pointing to the assets folder... simple as that..

    Edit 2: Example on how to configure webpack with the '~' alias... this should go on the webpack config file (usually 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')
      }
    }

    0 讨论(0)
  • 2021-01-30 07:06

    You won't be able to import any css to your vendors file using that stack, without making some changes.

    Why? Well because this line:

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

    It's only importing your css as string, when in reality what you want is your vendor css in a style tag. If you check config/webpack.commons.js you will find this rule:

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

    This rule allows your components to import the css files, basically this:

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

    In the AppComponent there's no encapsulation, because of this line encapsulation: ViewEncapsulation.None, which means any css rules will be applied globally to your app. So you can import the bootstrap styles in your app component:

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

    But if you insist in importing to your vendor.ts then you will need to install a new loader, npm i style-loader --save-dev this will allow webpack to inject css to your page. Then you need to create a specific rule, on your webpack.common.js and change the existing one:

     { //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
     },
    

    The firs rule will be only applied when you try to import css, from any package inside node_modules the second rule will be applied to any css that you import from outside the node_modules

    0 讨论(0)
  • 2021-01-30 07:14

    So here is a way to import various CSS files using the angular-cli which I find the most convenient.

    Basically, you can refer to the CSS files (order is important if you will be overriding them) in the config and angular-cli will take care of the rest. For instance, you might want to include a couple of styles from node-modules, which can be done as follows:

    "styles": [
        "../node_modules/font-awesome/css/font-awesome.min.css",
        "../node_modules/primeng/resources/primeng.min.css",
        "styles.css"
      ]
    

    A sample full-config might look like this:

    .angular-cli.json

    {
      "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
      "project": {
        "name": "my-angular-app"
      },
      "apps": [
        {
          "root": "src",
          "outDir": "dist",
          "assets": [
            "assets",
            "favicon.ico"
          ],
          "index": "index.html",
          "main": "main.ts",
          "polyfills": "polyfills.ts",
          "test": "test.ts",
          "tsconfig": "tsconfig.app.json",
          "testTsconfig": "tsconfig.spec.json",
          "prefix": "app",
          "styles": [
            "../node_modules/font-awesome/css/font-awesome.min.css",
            "../node_modules/primeng/resources/primeng.min.css",
            "styles.css"
          ],
          "scripts": [],
          "environmentSource": "environments/environment.ts",
          "environments": {
            "dev": "environments/environment.ts",
            "prod": "environments/environment.prod.ts"
          }
        }
      ],
      "e2e": {
        "protractor": {
          "config": "./protractor.conf.js"
        }
      },
      "lint": [
        {
          "project": "src/tsconfig.app.json",
          "exclude": "**/node_modules/**"
        },
        {
          "project": "src/tsconfig.spec.json",
          "exclude": "**/node_modules/**"
        },
        {
          "project": "e2e/tsconfig.e2e.json",
          "exclude": "**/node_modules/**"
        }
      ],
      "test": {
        "karma": {
          "config": "./karma.conf.js"
        }
      },
      "defaults": {
        "styleExt": "scss",
        "component": {}
      }
    }
    
    0 讨论(0)
提交回复
热议问题