如何将文档注入 systemjs-builder 以捆绑 Angular 4.0.0 应用程序?

Posted

技术标签:

【中文标题】如何将文档注入 systemjs-builder 以捆绑 Angular 4.0.0 应用程序?【英文标题】:How do I get document injected into systemjs-builder for bundling a angular 4.0.0 app? 【发布时间】:2017-09-12 04:59:03 【问题描述】:

我正在尝试捆绑一个 Angular 4.0.0 应用程序。

我尝试过 browserify,但新的 angular-loader 插件(允许在带有 templateUrl 的组件中不需要 moduleId)没有被调用,因此模板最终路径错误。

所以我转向了 systemjs-builder,但问题是当它运行该插件时它会崩溃,说该文档未定义。

有没有办法将文档注入构建器?

还是我做错了什么?

这是我正在测试的简单构建器(systemjs-config 是 angular quickstart 之一)。

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); 
);

【问题讨论】:

我一直在使用这个github.com/laxa1986/gulp-angular-embed-templates 和gulp。另外,看看***.com/questions/35867660/… 感谢@martin,我正试图摆脱 gulp 并仅使用 npm 完成所有工具以最小化依赖关系(我厌倦了我的 packages.json 长一英里),但是我会看看回购。我也许可以将其合并到 systemjs 构建器中。尽管如此,对于其他来到这里的人来说,我觉得我们不能这样做只是 systemjs builder 似乎很奇怪,必须有一种方法,如果有人有想法,我将非常感谢。 这可要了我的命,我似乎找不到解决办法。我很难相信我们是唯一试图提出一个可行的 systemjs 构建的人:( 你能分享一个重现这个问题的回购吗? 我不是 systemJS 用户,所以我不知道这是否有帮助,但是平台浏览器中有 DOCUMENT 的 DI 令牌。我会说,把它拉进去,然后用它。 【参考方案1】:

我长期以来一直在寻找解决这个问题的方法。由于找不到,我修改了 systemjs-angular-loader.js 以绕过错误。 有了这个 hack 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;
;

【讨论】:

以上是关于如何将文档注入 systemjs-builder 以捆绑 Angular 4.0.0 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Grails 服务注入 src/groovy 类

MongoDB如何避免SQL注入混乱?

如何将 DLL 注入 Adob​​e Reader X

如何在 Room MVVM 架构中实现 Koin 依赖注入

Spring文档苦读短生命周期的Bean注入长生命周期的Bean

是否可以将服务注入 apollo-client 的中间件?