javascript - Gulp med browserify, tsify och reactify?
Jag använder gulp med browserify och tsify i ett TypeScript-projekt. Följande är ett utdrag från min gulpfile.js:
var browserified = function (filename, debug) {
var b = browserify({
entries: filename,
debug: debug || false
});
b.plugin('tsify', {
noImplicitAny: true,
target: 'ES5'
});
b.transform('debowerify');
return b.bundle();
};
gulp.task('rebuild', ['lint', 'less'], function() {
var b = browserified ('./src/ts/main.ts', true);
return buildSourceMaps (b);
});
Det här fungerar hittills. Jag vill utöka detta så att jag kan require React JSX-filer. Först försökte jag (från en av mina TypeScript-filer):
import Test = require ('../jsx/Test.jsx');
Det här fungerar dock inte, eftersom tsify skulle klaga då det letar efter en TypeScript-fil ../jsx/Test.jsx.ts. Så jag använder följande hack:
declare var require: any;
var Test = require ('../jsx/Test.jsx');
Om Test.jsx är vanlig JavaScript fungerar detta. Om Test.jsx innehåller TypeScript skulle det misslyckas, vilket är vad jag förväntar mig. Hittills, så klart.
Nu vill jag lägga till reactify i mina gulp-uppgifter så att jag kan använda JSX i dessa filer. Här sitter jag fast! Jag försökte lägga till följande i funktionen browserified i min gulpfile.js:
b.plugin ('reactify', {
extension: 'jsx'
});
Jag får fortfarande följande fel när jag kör gulp rebuild när Test.jsx innehåller riktig JSX:
Unexpected token <
Självklart sätter gulp i halsen på den första JSX-specifika termen. Jag tror att gulp försöker skicka JSX genom TypeScript-kompilatorn. Vilket inte är överraskande, eftersom jag inte kan komma på ett sätt att tala om för tsify att ignorera mina .jsx-filer. Jag är ny på gulp, så jag är lite vilse. Några idéer om hur man ställer in gulp för att tillåta TypeScript med alla .ts-filer och JSX med alla .jsx-filer?
Svar #1
Det här är gulp-uppgiften jag använder för utveckling. Den använder watchify tillsammans med browserify och reactify för att bygga din kod, tillhandahålla källkartläggning och ompaketera eventuella ändringar du gör direkt. Variabeln path.ENTRY_POINT är huvudkomponenten för din React-app (ofta app.js eller main.js).
gulp.task('watch', function() {
gulp.watch(path.HTML, ['copy']);
var watcher = watchify(browserify({
entries: [path.ENTRY_POINT],
transform: [reactify],
debug: true,
cache: {}, packageCache: {}, fullPaths: true
}));
return watcher.on('update', function () {
watcher.bundle()
.pipe(source(path.OUT))
.pipe(gulp.dest(path.DEST_SRC))
console.log('Updated');
})
.bundle()
.pipe(source(path.OUT))
.pipe(gulp.dest(path.DEST_SRC));
});
Jag använde denna handledning för att ställa in min gulpfile.js och den ger en bra förklaring för varje gulp-uppgift: http://tylermcginnis.com/reactjs-tutorial-pt-2-building-react-applications-with-gulp-and-browserify/
