这是https://github.com/systemjs/builder/issues/611的交叉发布
我正在尝试将我的Angular 2 rc 1应用程序与systemjs-builder 0.15.16 buildStatic方法捆绑在一起。角度组件具有视图以及脚本外部的一个或多个样式表。在@Component元数据中以两种方式之一引用它们
buildStatic
@Component
使用绝对路径:
@Component({ templateUrl: 'app/some.component.html', styleUrls: ['app/some.component.css'] })
使用现在推荐的相对路径:
@Component({ moduleId: module.id, templateUrl: 'some.component.html', styleUrls: ['some.component.css'] })
我的应用使用相对路径,并且一切正常。今天,我决定使用systemjs- builder的buildStatic。只要存在相对路径,结果文件就会引发404错误,因为浏览器正在获取localhost/some.component.html而不是localhost/app/some.component.html。以下是我的 gulpfile.js* 的相关部分 *
localhost/some.component.html
localhost/app/some.component.html
var appDev = 'dev/'; var appProd = 'app/'; var typescript = require('gulp-typescript'); var tsProject = typescript.createProject('tsconfig.json'); var Builder = require('systemjs-builder'); var sourcemaps = require('gulp-sourcemaps'); gulp.task('build-ts', function () { return gulp.src(appDev + '**/*.ts') .pipe(sourcemaps.init()) .pipe(typescript(tsProject)) .pipe(sourcemaps.write()) .pipe(gulp.dest(appProd)); }); gulp.task('bundle',['build-ts'], function() { var builder = new Builder('', './systemjs.config.js'); return builder .buildStatic(appProd + '/main.js', appProd + '/bundle.js', { minify: false, sourceMaps: true}) .then(function() { console.log('Build complete'); }) .catch(function(err) { console.log('Build error'); console.log(err); }); });
使用相对路径,如果我只运行build- tsgulp任务并浏览“常规”方式,则一切正常。如果我运行bundlegulp任务并尝试使用该bundle.js文件浏览该应用程序,则该应用程序尝试加载外部模板和样式表的任何地方都会发生404错误。我尝试通过更改templateUrl: 'some.component.html'为templateUrl: './some.component.html'无效来明确说明路径的相对性质。硬编码绝对路径似乎是一个坏主意。我想念什么?
build- ts
bundle
bundle.js
templateUrl: 'some.component.html'
templateUrl: './some.component.html'
几天后,我从github上的systemjs成员那里得到了有益的答复。
诀窍是什么:在systemjs-builder buildStatic方法的配置对象中,将其设置encodeNames为false。所以线…
encodeNames
false
.buildStatic( appProd + '/main.js', appProd + '/bundle.js', { minify: false, sourceMaps: true} )
成了…
.buildStatic( appProd + '/main.js', appProd + '/bundle.js', { minify: false, sourceMaps: true, encodeNames:false} )
tsconfig.json
{ "compilerOptions": { "target": "ES5", "module": "commonjs", "moduleResolution": "node", "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": false, "noImplicitAny": false, "outDir": "./app" }, "filesGlob": [ "./dev/**/*.ts", "!./node_modules/**/*.ts" ], "exclude": [ "node_modules", "typings" ] }