LoginSignup
2
2

More than 5 years have passed since last update.

[Java][Spring][JavaScript][gulp][webpack][uglify] 私的AngularJSアプリ開発環境

Posted at

背景

JavaとAngularJSでSPAなWebアプリケーションを作っていました。
小規模なので、warのなかに全部入れてデプロイしてます。

JavaScriptファイルがたくさん増えてきて、なんとかまとめたいなと思いました。

葛藤の歴史

こんな葛藤の結果です。

warの中にJavaScriptも含むぞ!

<script>タグたくさん書くの面倒だし、ファイル1個にまとめたい。
そのほうがHTTPコネクションも少なくなるし。

Mavenでまとめよう!

どうもMavenでJavaScript触るのいけてない。
minifyしたら、なんか動かないことあるし!?

JavaScriptのことは、JavaScriptに任せたほうがよくね?

Mavenからnode呼ぶのも、なんかいけてない。
というか、Jenkinsの入っているビルド環境にはnodeないし。

もういいから、ビルドしたJavaScriptをレポジトリに含めちゃおうよ。 < イマココ!

ディレクトリ構成

このような構成にすることにしました。

src/
  main/
    java/                (Javaソース置き場) 
    js/                  (JavaScriptソース置き場)
      app.js             (webpackへ読み込ませるためのファイル)
      **/*.spec.js         (テストもここ)
      **/*.js              (その他いろいろJavaScript)
    webapp/
      static/
        js/
          bundle.js      (webpackでまとめたファイル)
          bundle.min.js  (uglifyで圧縮したファイル)
    resources/           (プロパティファイル等置き場)
  test/
    java/                (Javaテストソース置き場)
    resources/           (テスト用プロパティファイル等置き場)
gulpfile.js
karma.conf.js
package.json
pom.xml

bundle.jsbundle.min.jsは、あらかじめビルドしてレポジトリに格納することにしました。

開発作業時は……

gulpとkarmaを動かして、常にbundle.jsを更新させています。

NetBeansの自動デプロイを有効にして、bundle.jsが反映されるようにしています。

設定ファイル達

gulp

gulpfile.js
'use strict';

var gulp       = require('gulp');
var webpack    = require('gulp-webpack');
var uglify     = require('gulp-uglify');
var rename     = require('gulp-rename');
var path       = require('path');
var fs         = require('fs');
var karma      = require('karma');

var config = {
    srcdir: './src/main/js',
    dstdir: './src/main/webapp/static/js',
    src: 'app.js',
    dst: 'bundle.js',
    dstmin: 'bundle.min.js',
    karmaconf: path.join(__dirname, 'karma.conf.js')
};

gulp.task('webpack', () => {
    var opts = {
        debug: true,
        output: { filename: config.dst },
        devtool: '#source-map'
    };

    return gulp.src(path.join(config.srcdir, config.src))
        .pipe(webpack(opts))
        .pipe(gulp.dest(config.dstdir));
});

gulp.task('uglify', [ 'webpack' ], () => {
    var opts = {
        warnings: true
    };

    return gulp.src(path.join(config.dstdir, config.dst))
        .pipe(rename(config.dstmin))
        .pipe(uglify(opts))
        .pipe(gulp.dest(config.dstdir));
});

gulp.task('karma', ['uglify'], () => {
    var opts = {
        configFile: config.karmaconf,
        singleRun: true
    };

    new karma.Server(opts).start();
});

gulp.task('clean', () => {
    fs.unlink(path.join(config.dstdir, config.dst), () => {});
    fs.unlink(path.join(config.dstdir, config.dst) + '.map', () => {});
    fs.unlink(path.join(config.dstdir, config.dstmin), () => {});
});

gulp.task('all', [ 'uglify' ]);

gulp.task('default', ['all'], () => {
    var files = [
        path.join(config.srcdir, '**/*.js'),
        '!' + path.join(config.srcdir, '**/*.spec.js'),
        '!' + path.join(config.srcdir, '**/*.test.js')
    ];
    gulp.watch(files, ['all']);
});

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2