10

I'm trying to build a new project with ES6 modules without bundling. I still want to use babel-7 to translate TypeScript and JSX to JS. I find it hard to figure out how to set up a development-server for it. I couldn't find any kind of "babel-dev-server" that works similar to webpack-dev-server (hot-module-reloading, browser-sync, file-watcher).

One possibility would be to use browser sync as a static server on e.g. dist and run something like babel src --out-dir dist --watch in parallel. But this excludes hot-reloading and seems a bit clumsy to me. Besides, it would still be useful for build- and dev-steps if you could give the JS-files a hash to control caching better. Or can I configure a build-tool like webpack so that it doesn't perform bundling but still performs some transformations (like putting the hashs in the filenames in imports)?

4

4 回答 4

1

使用最新版本的Snowpack(以前的 @pika/web)现在应该可以了!

从他们的网站:

TL;DR - 使用 Snowpack,您可以构建现代 Web 应用程序(使用 React、Vue 等)而无需打包程序(如 Webpack、Parcel、Rollup)。每次点击保存时,无需再等待捆绑程序重建您的网站。相反,每个更改都会立即反映在浏览器中。

还有他们的“它是如何工作的”:

  1. 无需捆绑每次更改,只需在 npm 安装后立即运行一次 Snowpack。
  2. Snowpack 将您的依赖项作为单个 JS 文件重新安装到新的 web_modules/ 目录中。它永远不会触及您的源代码。
  3. 编写代码,通过 ESM 导入导入这些依赖项,然后在浏览器中运行它。
  4. 跳过捆绑步骤并在点击保存后立即在浏览器中看到您的更改。
  5. 继续使用您最喜欢的 Web 框架和构建工具!支持 Babel 和 TypeScript。

查看https://www.snowpack.dev/了解更多信息,他们的文档做得很好,看起来很有希望!

于 2020-01-14T09:22:37.637 回答
1

原型制作方式

一个非常简单的方法是将服务器和转译视为单独的步骤

您可以使用独立版本的 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完成一些事情。

于 2018-10-24T10:31:01.540 回答
0

你可以使用像Emit All这样的 Webpack 插件。

于 2018-10-23T16:58:49.740 回答
0

使用 webpack 和 source maps,它不会改变你的代码。虽然最初设置这可能是一个挑战,但一旦您开始工作,您就可以在浏览器调试工具中查看原始源代码,就像它们在磁盘上显示的一样。VS Code 编辑器也很好地支持了此功能,允许您直接在编辑器中设置断点并查看变量的值,而无需使用浏览器开发工具。

然而,如果你仍然打算让它与你的原始源文件一起工作,那么你的 ES6 代码应该在大多数现代浏览器中工作是对的

对于实时重新加载,您可以查看npm livereload 包

或者你可以自己动手并弄清楚 webpack-dev-server 是如何做到的。他们使用 chokidar npm 包来监视文件系统的变化,然后通过 Web 套接字通知浏览器。您可能只需稍加努力就可以将类似的东西放在一起。

以下是webpack-dev-server 启动它的方式

const watcher = chokidar.watch(watchPath, options);

watcher.on('change', () => {
  this.sockWrite(this.sockets, 'content-changed');
});

显然,浏览器中运行的一些 JavaScript 在等待该消息的 websocket。

于 2018-10-22T19:22:54.863 回答