Как мне ввести документ в systemjs-builder для связывания приложения angular 4.0.0?

Я пытаюсь связать приложение angular 4.0.0.

Я пытался использовать браузер, но новый плагин angular-loader (который позволяет не использовать moduleId в компонентах с templateUrl) не вызывается, и поэтому шаблоны заканчиваются неправильным путем.

Поэтому я перешел на systemjs-builder, но проблема в том, что когда он запускает этот плагин, он вылетает, говоря, что документ не определен.

Есть ли способ вставить документ в билдер?

Или я что-то не так делаю?

Это простой билдер, который я тестирую (systemjs-config — это угловой быстрый запуск).

var path = require("path"); 
var Builder = require('systemjs-builder');

var builder = new Builder('src/frontend', 'src/frontend/systemjs.config.js');

builder .bundle('main.js', 'bundle.js') 
.then(function() {   
     console.log('Build complete'); 
}) 
.catch(function(err) {   
     console.log('Build error');   
     console.log(err); 
});

person Ricardo Gomes    schedule 16.04.2017    source источник
comment
Я использовал этот github.com/laxa1986/gulp-angular-embed-templates с gulp. Кроме того, взгляните на stackoverflow.com/questions/35867660/   -  person martin    schedule 17.04.2017
comment
спасибо @martin, я пытаюсь уйти от gulp и использовать все инструменты, используя только npm, чтобы минимизировать зависимости (я устал от того, что мой package.json имеет длину в милю), но я посмотрю репо . Я мог бы просто включить это в сборщик systemjs. Тем не менее, всем, кто приходит сюда, мне кажется странным, что мы не можем сделать это, это просто сборщик systemjs, должен быть способ, и если у кого-то есть идея, я буду очень благодарен.   -  person Ricardo Gomes    schedule 17.04.2017
comment
Это убивает меня, я не могу найти решение. Мне трудно поверить, что мы единственные, кто пытается придумать сборку systemjs, которая просто работает :(   -  person Tamas    schedule 05.05.2017
comment
Можете ли вы поделиться репо, которое воссоздает эту проблему?   -  person JayChase    schedule 12.05.2017
comment
Я не пользователь systemJS, поэтому я не знаю, полезно ли это, но внутри браузеров-платформ есть токен DI для ДОКУМЕНТА. Я бы сказал, втяните это и используйте это.   -  person Sander Elias    schedule 15.05.2017


Ответы (1)


Я искал решение этой проблемы в течение долгих часов. Поскольку я не смог его найти, я изменил systemjs-angular-loader.js, чтобы обойти ошибку. С этим хаком теперь работает systemjs-builder.

var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)['"`]\s*)/gm;
var stylesRegex = /styleUrls *:(\s*\[[^\]]*?\])/g;
var stringRegex = /(['`"])((?:[^\\]\\\1|.)*?)\1/g;

module.exports.translate = function(load){
  if (load.source.indexOf('moduleId') != -1) return load;

  var document=document || null;
  if(document){
    var url = document.createElement('a');
    url.href = load.address;

    var basePathParts = url.pathname.split('/');

    basePathParts.pop();
    var basePath = basePathParts.join('/');

    var baseHref = document.createElement('a');
    baseHref.href = this.baseURL;
    baseHref = baseHref.pathname;

    if (!baseHref.startsWith('/base/')) { // it is not karma
      basePath = basePath.replace(baseHref, '');
    }
  }
  else{
    var address=load.address;
    address=address.replace('file:///'+__dirname+'/', '');
    var basePathParts = address.split('/');

    basePathParts.pop();
    var basePath = basePathParts.join('/');
  }

  load.source = load.source
    .replace(templateUrlRegex, function(match, quote, url){
      var resolvedUrl = url;

      if (url.startsWith('.')) {
        resolvedUrl = basePath + url.substr(1);
      }

      return 'templateUrl: "' + resolvedUrl + '"';
    })
    .replace(stylesRegex, function(match, relativeUrls) {
      var urls = [];

      while ((match = stringRegex.exec(relativeUrls)) !== null) {
        if (match[2].startsWith('.')) {
          urls.push('"' + basePath + match[2].substr(1) + '"');
        } else {
          urls.push('"' + match[2] + '"');
        }
      }

      return "styleUrls: [" + urls.join(', ') + "]";
    });

  return load;
};

person Genoud Magloire    schedule 20.06.2017