原型制作方式
一个非常简单的方法是将服务器和转译视为单独的步骤
您可以使用独立版本的 babel 作为您加载的第一个脚本,因此您可以在 javascript 文件的 html 文档中编写 jsx 而无需编译它们。
只需添加来自https://cdnjs.com/libraries/babel-standalone/的 cdn 链接作为脚本,如下所示:
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.0.0-beta.3/babel.min.js"></script>
<script src="/your/jsx/here.js"></script>
<script>
// or here
</script>
</head>
<body>
<div id="application" />
<noscript>This app needs javascript enabled in order to run.</noscript>
</body>
</html>
这将允许您使用任何监视文件的网络服务器真正快速地制作原型。您可以使用任何任务运行器插件(即用于 grunt 或 gulp)来执行此操作,或者如果您使用的是 Visual Studio,请查看LiveServer插件。
当您转向生产级时,您可能不想包含整个 babel 库。请参阅其他两种方法。
Webpack 方式
您在问如何在不捆绑的情况下使用 webpack。这可以使用文件加载器插件来完成,以使用glob模式分别加载每个文件。请确保这是否确实是您需要的。如果您只想在编译后简单地调试您的代码并将其与原始文件相关联,那么您所需要的只是使用捆绑和sourcemaps的标准 webpack 配置。
任务运行方式
一种更好地控制每个文件的处理方式的方法是,您可以使用任务运行程序为您执行编译步骤。下面是 taskrunner https://gulpjs.com/ 的简化示例配置。
gulpfile.js
const gulp = require('gulp');
const watch = require('gulp-watch');
const webpackStream = require('webpack-stream');
const webpack = require('webpack');
const eslint = require('gulp-eslint');
gulp.task('watch', function() {
return watch('src/**.js', ['compile']);
});
gulp.task('lint', function() {
return gulp.src(['src/*.js', 'src/*/*.js'])
.pipe(eslint({
parser: 'babel-eslint',
parserOptions: {
ecmaFeatures: {
jsx: true
},
sourceType: 'module'
}
}))
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
gulp.task('compile', ['lint'], function() {
return gulp.src('src/main.js')
.pipe(webpackStream({
output: {
filename: 'main.js',
libraryTarget: 'commonjs2',
sourceMapFilename: 'main.js.map',
},
plugins: [],
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: [
require.resolve('babel-preset-es2015'),
require.resolve('babel-preset-stage-0'),
],
},
},
],
},
}), webpack)
.pipe(gulp.dest('dist/'));
});
此示例文件可以使用gulp watch
. 它会观察文件是否有机会以及何时触发其他任务。
我只有一个 webpack 的例子,但你可以用任何其他编译器组件替换它,或者如果你愿意(可能你不这样做),甚至可以编写自己的编译步骤。
通过这种方式,您可以精确控制文件经过的每一步。其中大部分(以及更多)也可以使用Webpack 的方式来实现。但是,当将每个文件作为单独的包处理时,它的缺点是将其所有样板插入每个已处理文件的顶部。最终可能可以用common chunks plugin完成一些事情。