How can I add Font Awesome to my Aurelia project using npm?

前端 未结 8 2110
梦谈多话
梦谈多话 2020-11-30 08:31

I have been following the Contact Manager tutorial and would like to add Font Awesome to the project. Here\'s what I have done so far:

  • npm insta
相关标签:
8条回答
  • 2020-11-30 09:00

    importing css/fonts automagicly is now supported.

    {
        "name": "font-awesome",
        "path": "../node_modules/font-awesome/css",
        "main": "font-awesome.css"
    }
    
    <require from="font-awesome.css"></require>
    

    Checkout this "Issue" https://github.com/aurelia/cli/issues/249
    Happy codding


    EDIT

    I realized/read the comments this does not copy the font files. Here is an updated build script (es6) that will copy any resources and add the folder to the git ignore. If you want the typescript version check here
    https://github.com/aurelia/cli/issues/248#issuecomment-253837412

    ./aurelia_project/tasks/build.js

    import gulp from 'gulp';
    import transpile from './transpile';
    import processMarkup from './process-markup';
    import processCSS from './process-css';
    import { build } from 'aurelia-cli';
    import project from '../aurelia.json';
    import fs from 'fs';
    import readline from 'readline';
    import os from 'os';
    
    export default gulp.series(
      copyAdditionalResources,
      readProjectConfiguration,
      gulp.parallel(
        transpile,
        processMarkup,
        processCSS
      ),
      writeBundles
    );
    
    function copyAdditionalResources(done){
      readGitIgnore();
      done();
    }
    
    function readGitIgnore() {
      let lineReader = readline.createInterface({
        input: fs.createReadStream('./.gitignore')
      });
      let gitignore = [];
    
      lineReader.on('line', (line) => {
        gitignore.push(line);
      });
    
      lineReader.on('close', (err) => {
        copyFiles(gitignore);
      })
    }
    
    function copyFiles(gitignore) {
      let stream,
        bundle = project.build.bundles.find(function (bundle) {
          return bundle.name === "vendor-bundle.js";
        });
    
      // iterate over all dependencies specified in aurelia.json
      for (let i = 0; i < bundle.dependencies.length; i++) {
        let dependency = bundle.dependencies[i];
        let collectedResources = [];
        if (dependency.path && dependency.resources) {
          // run over resources array of each dependency
          for (let n = 0; n < dependency.resources.length; n++) {
            let resource = dependency.resources[n];
            let ext = resource.substr(resource.lastIndexOf('.') + 1);
            // only copy resources that are not managed by aurelia-cli
            if (ext !== 'js' && ext != 'css' && ext != 'html' && ext !== 'less' && ext != 'scss') {
              collectedResources.push(resource);
              dependency.resources.splice(n, 1);
              n--;
            }
          }
          if (collectedResources.length) {
            if (gitignore.indexOf(dependency.name)< 0) {
              console.log('Adding line to .gitignore:', dependency.name);
              fs.appendFile('./.gitignore', os.EOL + dependency.name, (err) => { if (err) { console.log(err) } });
            }
    
            for (let m = 0; m < collectedResources.length; m++) {
              let currentResource = collectedResources[m];
              if (currentResource.charAt(0) != '/') {
                currentResource = '/' + currentResource;
              }
              let path = dependency.path.replace("../", "./");
              let sourceFile = path + currentResource;
              let destPath = './' + dependency.name + currentResource.slice(0, currentResource.lastIndexOf('/'));
              console.log('Copying resource', sourceFile, 'to', destPath);
              // copy files
              gulp.src(sourceFile)
                .pipe(gulp.dest(destPath));
            }
          }
        }
      }
    }
    
    
    function readProjectConfiguration() {
      return build.src(project);
    }
    
    function writeBundles() {
      return build.dest();
    }
    
    0 讨论(0)
  • 2020-11-30 09:01

    Not actually answering to your question of how to integrate Font Awesome in your application using NPM, but there is an alternative, clean way to get it in your application: using the CDN.

    As mentioned in other answers, Aurlia currently doesn't support bundling resources other than js, css and html out-of-the-box using the CLI. There's a lot of discussion about this subject, and there are several, mostly hacky, workarounds, like some suggested here.

    Rob Eisenberg says he's planning on getting it properly integrated in the Aurelia CLI, but he considers it low priority because there's a simple workaround. To quote him:

    Of course there is interest in addressing this. However, it's lower priority than other things on the list for the CLI, in part because a simple link tag will fix the problem and is much easier than the work we would have to do to solve this inside the CLI.

    Source: https://github.com/aurelia/cli/issues/248#issuecomment-254254995

    1. Get your unique CDN link mailed here: http://fontawesome.io/get-started/
    2. Include this link in the head of your index html file
    3. Don't forget to remove everything you might have already added to try to get it working: the npm package (and its reference in your package.json), the reference in your aurelia.json file, any custom tasks you might have created, any <require> tags,...
    0 讨论(0)
  • 2020-11-30 09:04

    Don't add font-awesome resources to aurelia.json - you'd need font files too, which Aurelia don't process. Instead, take the following steps.

    First, if you added anything for font-awesome already to your aurelia.json file, remove it again.

    Add new file prepare-font-awesome.js in folder \aurelia_project\tasks and insert the below code. It copies font-awesome resource files to output folder (as configured aurelia.json config file; e.g. scripts):

    import gulp from 'gulp';
    import merge from 'merge-stream';
    import changedInPlace from 'gulp-changed-in-place';
    import project from '../aurelia.json';
    
    export default function prepareFontAwesome() {
      const source = 'node_modules/font-awesome';
    
      const taskCss = gulp.src(`${source}/css/font-awesome.min.css`)
        .pipe(changedInPlace({ firstPass: true }))
        .pipe(gulp.dest(`${project.platform.output}/css`));
    
      const taskFonts = gulp.src(`${source}/fonts/*`)
        .pipe(changedInPlace({ firstPass: true }))
        .pipe(gulp.dest(`${project.platform.output}/fonts`));
    
      return merge(taskCss, taskFonts);
    }
    

    Open the build.js file in the \aurelia_project\tasks folder and insert the following two lines; this will import the new function and execute it:

    import prepareFontAwesome from './prepare-font-awesome'; // Our custom task
    
    export default gulp.series(
      readProjectConfiguration,
      gulp.parallel(
        transpile,
        processMarkup,
        processCSS,
        prepareFontAwesome // Our custom task
      ),
      writeBundles
    );
    

    Finally, in the <head> section of your index.html file, just add the following line:

    <link rel="stylesheet" href="scripts/css/font-awesome.min.css">
    

    That's all; now you can use font-awesome icons in any Aurelia view modules (html files).

    Note that this works for any complex third party library which requires resources which you have to manually include.

    0 讨论(0)
  • 2020-11-30 09:04

    You don't need more much this:

    in aurelia.json

    "dependencies": [
          "jquery",
          "text",
          {
            "name": "bootstrap",
            "path": "../node_modules/bootstrap/dist/",
            "main": "js/bootstrap.min",
            "deps": ["jquery"],
            "resources": [
              "css/bootstrap.min.css"
            ]
          },
          {
            "name": "font-awesome",
            "path": "../node_modules/font-awesome/css",
            "main": "",
            "resources": [
              "font-awesome.min.css"
            ]
          }
        ]
      }
    ],
    "copyFiles": {
      "node_modules/font-awesome/fonts/fontawesome-webfont.woff": "fonts/",
      "node_modules/font-awesome/fonts/fontawesome-webfont.woff2": "fonts/",
      "node_modules/font-awesome/fonts/FontAwesome.otf": "fonts/",
      "node_modules/font-awesome/fonts/fontawesome-webfont.ttf": "fonts/",
      "node_modules/font-awesome/fonts/fontawesome-webfont.svg": "fonts/"
    }
    

    See section Setup for copying files

    i hope help you.

    0 讨论(0)
  • 2020-11-30 09:10

    Funny I was trying to get the same thing working this morning. This is all I had to do in my aurelia.json dependencies for it to work:

          {
            "name": "font-awesome",
            "path": "../node_modules/font-awesome/",
            "main": "",
            "resources": [
              "css/font-awesome.min.css"
            ]
          },
    

    Then in my html I had:

    <require from="font-awesome/css/font-awesome.min.css"></require>
    
    0 讨论(0)
  • 2020-11-30 09:11

    I believe that bundles.dependencies section is for referencing JS libraries.

    In your case, a bit of additional work will be needed. According to Aurelia CLI docs, you can create your own generators as well, which comes in handy for us.

    Add some new paths to aurelia.json:

    "paths": {
        ...
        "fa": "node_modules\\font-awesome",
        "faCssOutput": "src",
        "faFontsOutput": "fonts"
        ...
    }
    

    Create a task for css bundling... au generate task fa-css

    Modified task file: aurelia_project\tasks\fa-css.js|ts

    import * as gulp from 'gulp';
    import * as changedInPlace from 'gulp-changed-in-place';
    import * as project from '../aurelia.json';
    import {build} from 'aurelia-cli';
    
    export default function faCss() {
        return gulp.src(`${project.paths.fa}\\css\\*.min.css`)
            .pipe(changedInPlace({firstPass:true}))
            /* this ensures that our 'require-from' path  
               will be simply './font-awesome.min.css' */
            .pipe(gulp.dest(project.paths.faCssOutput))
            .pipe(gulp.src(`${project.paths.faCssOutput}\\font-awesome.min.css`))
            .pipe(build.bundle());
    };
    

    ...and another for copying font files: au generate task fa-fonts

    Modified task file: aurelia_project\tasks\fa-fonts.js|ts

    import * as gulp from 'gulp';
    import * as project from '../aurelia.json';
    
    export default function faFonts() {
        return gulp.src(`${project.paths.fa}\\fonts\\*`)
            .pipe(gulp.dest(project.paths.faFontsOutput));
    }
    

    Add these new tasks above to the build process in aurelia_project\tasks\build.js|ts:

    export default gulp.series(
        readProjectConfiguration,
        gulp.parallel(
            transpile,
            processMarkup,
            processCSS,
            // custom tasks
            faCss,
            faFonts
        ),
        writeBundles
    );
    

    After doing these steps, au build should embed font-awesome.min.css into scripts/app-bundle.js and copy necessary font files to ./fonts folder.

    Last thing to do is to require font-awesome within our html.

    <require from ="./font-awesome.min.css"></require>
    
    0 讨论(0)
提交回复
热议问题