【发布时间】:2016-01-26 07:05:01
【问题描述】:
我正在尝试在 NodeJS 和网络浏览器中开发一个同构游戏。我决定将我的代码库转移到 ES6 和 ES7 并用 BabelJS 编译它。
我在使用 Gulp、Babelify 和 Gulp-develop-server 编译代码时遇到了困难。
第一期
首先,当我使用 Gulp watch 并调用时,服务器似乎缓存了文件
应用结构
node_modules 中的文件在那里,因为那时我不需要相对导入路径。从“事件/事件”导入事件;而不是从 '../event' 导入事件;
src
|
| -- client
| |
| | -- main.js (Entrypoint, instantiate game.js class)
| | -- ...
|
| -- server
| |
| | -- main.js (Entrypoint, instantiate game.js class)
| | -- ...
|
| -- node_modules
| |
| | -- event
| | |
| | | -- event.js (See singleton below)
| | | -- package.json ({ "browserify": { "transform": [ [ "babelify", { "stage": "0" } ] ] } })
| | -- game
| | |
| | | -- game.js (Class, imports event.js)
| | | -- package.json ({ "browserify": { "transform": [ [ "babelify", { "stage": "0" } ] ] } })
| | -- ...
第二期
当我导入我的单例时,它缺少它的功能。以前,我尝试创建一个类,并导出它的一个实例,但这不起作用。
单例
export default
{
events: new Map(),
dispatch: function ( name, value )
{
if ( !this.events.has( name ) )
{
this.events.set( name, [] );
}
for ( var func of this.events.get( name ) )
{
func( value );
}
},
listen: function ( name, func )
{
if ( !this.evens.has( name ) )
{
this.events.set( name, [ func ] );
}
this.events.get( name ).push( func );
}
};
类(.listen() 不起作用)
import Event from 'event/event';
export default class Game
{
constructor()
{
// listen is undefined
Event.listen( 'play', function () {} );
}
}
Gulp 缓存
var gulp = require( 'gulp' ),
babel = require( 'gulp-babel' ),
babelify = require( 'babelify' ),
server = require( 'gulp-develop-server' ),
source = require( 'vinyl-source-stream' ),
changed = require( 'gulp-changed' ),
sourcemaps = require( 'gulp-sourcemaps' ),
browserify = require( 'browserify' ),
autoprefixer = require( 'gulp-autoprefixer' ),
watchify = require( 'watchify' );
var paths = {
client: 'src/client/',
common: 'src/node_modules/',
server: 'src/server/',
html: 'src/client/view/',
css: 'src/client/view/css/',
assets: 'src/client/view/assets/',
node_modules: 'node_modules',
build_client: 'build/client',
build_server: 'build'
};
var files = {
client: paths.build_client + '/client.js',
server: paths.build_server + '/server_src.js'
}
gulp.task( 'watch', [ 'build', 'server:start' ], function ()
{
var originalKeys = Object.keys( require.cache );
gulp.watch( [ paths.common + '**/*.js', paths.client + '**/*.js' ], [ 'client:js' ] );
gulp.watch( [ paths.common + '**/*.js', paths.server + '**/*.js' ], [ 'server:restart' ] );
} );
gulp.task( 'watch_client:js', function ()
{
var bundle = browserify(
{
debug: true,
entries: './src/client/main.js',
cache:
{},
packageCache:
{}
} );
bundle = watchify( bundle );
bundle.transform( babelify.configure(
{
sourceMaps: true,
stage: 0
} ) );
bundle.on( 'update', function ()
{
executeBundle( bundle );
} );
executeBundle( bundle );
} );
function executeBundle( bundle )
{
var start = Date.now();
bundle
.bundle()
.on( "error", function ( err )
{
console.log( "Error : " + err.message );
} )
.pipe( source( 'client.js' ) )
.pipe( gulp.dest( paths.build_client ) )
.on( 'time', function ( time )
{
console.log( 'Bundle finished in ' + time + '.' );
} );
}
gulp.task( 'build', [ 'client:js', 'client:node_modules', 'server:js' ] );
gulp.task( 'client:js', function ()
{
browserify(
{
debug: true,
cache:
{},
packageCache:
{}
} )
.transform( babelify.configure(
{
sourceMaps: true,
stage: 0
} ) )
.require( "./src/client/main.js",
{
entry: true
} )
.bundle()
.pipe( source( 'client.js' ) )
.pipe( gulp.dest( paths.build_client ) );
} );
gulp.task( 'client:node_modules', function ()
{
return gulp.src( [ paths.node_modules + '/socket.io/node_modules/socket.io-client/socket.io.js' ] )
.pipe( changed( paths.build_client ) )
.pipe( gulp.dest( paths.build_client ) );
} );
gulp.task( 'server:js', function ()
{
browserify(
{
debug: true
} )
.transform( babelify.configure(
{
sourceMaps: true,
stage: 0
} ) )
.require( "./src/server/main.js",
{
entry: true
} )
.bundle()
.pipe( source( 'server_src.js' ) )
.pipe( gulp.dest( './build' ) );
gulp.src( './src/server/server.js' )
.pipe( gulp.dest( paths.build_server ) );
} );
gulp.task( 'server:start', [ 'server:js' ], function ()
{
server.kill();
server.listen(
{
path: paths.build_server + '/server.js'
} );
} );
gulp.task( 'server:restart', [ 'server:js' ], function ()
{
server.restart();
} );
【问题讨论】:
标签: javascript gulp ecmascript-6 browserify babeljs