Загружать файлы JavaScript и CSS в папки в AngularJS

У меня есть приложение AngularJS, и в будущем некоторые разработчики из других команд будут разрабатывать модули, которые будут установлены как его части. Итак, я определил структуру папок, как показано ниже.

www/
  index.html
  app.js
  modules/
    modulesA/ -- will be copied when module A was installed
      moduleA.js
      moduleA.css
      moduleA.partial.html
    modulesB/ -- will be copied when module B was installed
      moduleB.js
      moduleB.css
      moduleB.partial.html

Теперь у меня проблема. Когда пользователь установил модуль A, как разрешить AngularJS (и приложению) загружать JS и CSS в свою папку? Есть ли какая-нибудь библиотека, которая может загружать JS и CSS по папкам, чтобы я мог поместить код в index.html лайки <script src="/modules/**/*.js"></script> <link src="/modules/**/*.css"/>

В противном случае мне придется добавить несколько заполнителей в index.html и изменить содержимое, когда пользователь установит модуль, например, <script src="/app.js"></script> <!-- $$_JS_$$ --> <link src="/app.css"/> <!-- $$_CSS_$$ -->


person Shaun Xu    schedule 24.03.2014    source источник
comment
См. Этот stackoverflow.com/questions/24097146/   -  person TheKojuEffect    schedule 09.06.2014


Ответы (2)


AngularJS не поддерживает то, что вы хотите, но вы можете взглянуть на инструменты сборки, такие как Grunt или Gulp, которые позволяют вам «создавать» ваше приложение за вас. В вашем случае эти инструменты могут искать файлы CSS и объединять их в один файл. Таким образом, ваш index.html не должен изменяться, если вы когда-либо добавляете новые модули.

GruntJS: http://gruntjs.com/

GulpJS: http://gulpjs.com/

Лично я использую GulpJS, поскольку он кажется намного быстрее, и мне было проще настроить:

Включил мой файл конфигурации ниже. Например, задача «стили» скомпилирует каждый файл css, который он найдет в указанных мною папках, объединит их и поместит в папку распространения.

Поскольку есть начальная кривая обучения тому, как использовать эти инструменты, вы всегда можете интегрировать gulp или grunt в своем собственном темпе. На данный момент вы можете позволить ему создавать ваши файлы css, а затем расширять их, объединяя JS и выполняя различные другие задачи. На мой взгляд, его стоит изучить, так как это сэкономит вам много времени и усилий.

var gulp = require("gulp");
var concat = require("gulp-concat");
var html2js = require("gulp-ng-html2js");
var sass = require("gulp-sass");
var clean = require("gulp-clean");
var streamqueue = require("streamqueue");

var ngDepOrder = require("gulp-ng-deporder");

var paths = {
    "dist": "../server/staffing/static/",
    "vendor": ['vendor/underscore/underscore.js',
        'vendor/angular/angular.min.js',
        'vendor/angular-route/angular-route.min.js',
        'vendor/restangular/dist/restangular.min.js',
        'vendor/angular-animate/angular-animate.min.js',
        'vendor/angular-bootstrap/ui-bootstrap-0.7.0.min.js',
        'vendor/angular-bootstrap/ui-bootstrap-tpls-0.7.0.min.js',
        'vendor/angular-ui-router/release/angular-ui-router.min.js',
        'vendor/angular-bootstrap-colorpicker/js/bootstrap-colorpicker-module.js',
        'vendor/momentjs/min/moment.min.js'],
    "scripts": ['app/**/*.js'],
    "fonts": ['app-data/fonts/*.*'],
    "templates": ['app/**/*.html'],
    "styles": ['app/**/*.scss','vendor/angular-bootstrap-colorpicker/css/*.css']
}

gulp.task("watch", function () {
    gulp.watch('app/**/*.js', ['scripts']);
    gulp.watch('app/**/*.html', ['scripts'])
    gulp.watch('app/**/*.scss', ['styles']);
})

gulp.task("default", ["clean"], function () {
    gulp.start("scripts", "vendor", "styles", "fonts");
})

gulp.task("clean", function () {
    return gulp.src(paths.dist, {read: false})
        .pipe(clean({force: true}));
})

gulp.task("vendor", function () {
    gulp.src(paths.vendor)
        .pipe(concat("vendor.js"))
        .pipe(gulp.dest(paths.dist + "js/"));
});

gulp.task("scripts", function () {
    var stream = streamqueue({objectMode: true});
    stream.queue(gulp.src(paths.scripts)
        .pipe(ngDepOrder()));
    stream.queue(gulp.src(paths.templates)
        .pipe(html2js({moduleName: "templates"})));
    return stream.done()
        .pipe(concat("app.js"))
        .pipe(gulp.dest(paths.dist + "js/"))
});

gulp.task("styles", function () {
    gulp.src(paths.styles)
        .pipe(sass())
        .pipe(concat("staffing.css"))
        .pipe(gulp.dest(paths.dist + "css/"))
})

gulp.task("fonts", function () {
    gulp.src(paths.fonts).
        pipe(gulp.dest(paths.dist + "fonts/"))
})
person Busata    schedule 24.03.2014
comment
пожалуйста, используйте правильный URL для gulpjs. Это не gruntjs.com ...: / - person gerl; 17.07.2015
comment
Не лучшее решение, если ваши зависимости загружаются из файла server.js проекта nodejs следующим образом: app.use('/scripts', express.static(__dirname + '/app/scripts')); Использование app.use('/*/*.js', express.static(__dirname + '/app/*/*.js')); вызвало ERR_ABORTED в консоли - person Sudhir Kaushik; 06.01.2018

Посмотрите угловой генератор для Slush, он делает то, что я думаю, вы хотите, используя файлы gulp-bower и gulp-inject. Вы указываете зависимости своего приложения с помощью bower, и они собираются и вводятся с помощью gulp с помощью gulp-inject, который затем вставляет в ваш index.html соответствующие теги link / src / style, которые очень похожи на ваши собственные примеры выше. JS и CSS модулей также собираются, минимизируются, объединяются и внедряются. Он также компилирует частичные файлы и вставляет их в $ templateCache.

Я использовал его для автоматического включения зависимостей из модулей / представлений подпапок с использованием макета проекта, аналогичного вашему.

Обратите внимание, что все зависимости вашего поставщика должны быть пакетами bower, которые указывают свои файлы dist с помощью атрибута main в bower.json. Некоторые пакеты не делают этого должным образом, но легко создать вилку пакета и добавить их самостоятельно, а затем указать на обновленное репо.

person jmcmichael    schedule 20.05.2014