Aurelia和System.js生产构建

时间:2017-11-08 13:57:18

标签: javascript aurelia systemjs

我正在维护现有的Aurelia项目,该项目显然不是用Aurelia CLI创建的。

我需要创建生成版本,但无法使用当前配置。开发构建工作正常,但正如预期的那样,将大量代码下载到用户机器。

运行gulp prod(下面列出的gulpfile)后,我得到两个JS文件:app-build-{revnumber}.jsvendor-build-{revnumber}.js,但Aurelia一直在尝试加载main.js文件。

Error loading main.js

我尝试一起构建main.jsgulpfile.js中的注释代码),但没有成功 - 只加载了供应商包:

Only vendor bundle is loaded

以下是我的配置文件:

config.js

System.config({
  baseURL: "/www",
  defaultJSExtensions: true,
  transpiler: "babel",
  babelOptions: {
    "stage": 0,
    "optional": [
      "runtime",
      "optimisation.modules.system"
    ]
  },
  paths: {
    "*": "src/*",
    "github:*": "jspm_packages/github/*",
    "npm:*": "jspm_packages/npm/*"
  },
  map: { /* mappings */ }
});

gulpfile.js

var gulp = require('gulp');
var bundler = require('aurelia-bundler');
var image = image = require('gulp-image');
var replace = require('gulp-replace');
var gulpsync = require('gulp-sync')(gulp);

var config = {
  force: true,
  baseURL: '.',
  configPath: './config.js',
  bundles: {
    // "dist/main": {
    //   includes: [
    //     '[main.js]'
    //   ],
    //   options: {
    //     inject: true,
    //     minify: false,
    //     rev: false
    //   }
    // },
    "dist/app-build": {
      includes: [
        '[**/*.js]',
        '**/*.html!text',
        '**/*.css!text'
      ],
      options: {
        inject: true,
        minify: true,
        rev: true
      }
    },
    "dist/vendor-build": {
      includes: [ /* all external modules */ ],
      options: {
        inject: true,
        minify: true,
        rev: true
      }
    }
  }
};

gulp.task("bundle", function () {
  return bundler.bundle(config)
    .then(function () {
      gulp.src('config.js')
        .pipe(replace('dist/', ''))
        .pipe(replace('src', 'dist'))
        .pipe(gulp.dest(''));
    });
});

gulp.task("unbundle",
  function () {
    return bundler.unbundle(config)
      .then(function () {
        gulp.src('config.js')
          .pipe(replace('dist', 'src'))
          .pipe(gulp.dest(''));
      });
  });

gulp.task("image-bundle",
  function () {
    gulp.src('./src/media/*')
      .pipe(image())
      .pipe(gulp.dest('./dist/media'));
  });

gulp.task("files-bundle", function () {
  return gulp
    .src('./src/style/material.woff2')
    .pipe(gulp.dest('./dist/style'));
});

gulp.task('prod', gulpsync.sync(['unbundle', 'bundle', 'image-bundle', 'files-bundle']));

gulp.task('dev', gulpsync.sync(['unbundle']));

的index.html

<!DOCTYPE html>
<html>
<head>...</head>
<body aurelia-app="main">
    <script src="www/jspm_packages/system.js"></script>
    <script src="www/config.js"></script>
    <script>
        System.import('aurelia-bootstrapper');
    </script>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

经过大量的小调整,我解决了main.js问题。

似乎System.js在bundle中查找依赖项,如果没有找到,它就会命中网络。以下是我修复捆绑包所做的事情:

  1. 合并dist/文件夹作为捆绑源

    config.js中,将*的路径设置为dist/*,并且不要在任何Gulp任务中修改它。 from src to dist

  2. 在捆绑任务运行之前,我将所有内容从src/复制到dist/
  3. dist/app-build捆绑包中,我添加了选项depCache: true。它在false时没有效果(给出错误main.js未找到),但我不知道为什么。
  4. 添加/修改的Gulp任务:

    // deletes all files in the output path
    gulp.task('clean', ['unbundle'], function () {
      return gulp.src(['dist/'])
        .pipe(vinylPaths(del));
    });
    
    gulp.task('copy', function () {
      return gulp.src(['src/**/*'])
        .pipe(gulpCopy('dist/', { prefix: 1 }));
    });
    
    gulp.task("bundle", sync(['clean', 'copy']), function () {
      return bundler.bundle(config);
    });
    
    gulp.task("unbundle", function () {
      return bundler.unbundle(config);
    });