如果不存在,如何使用 Browserify 创建新目录?

How to create a new directory with Browserify if it does not exist?

我尝试使用 Browserify 和 Gulp.
将已编译的 js 包文件保存到生产目录 但是 Browserify 似乎找不到输出目录的有效路径。
下面是代码片段:

  browserify({ debug: true })
    .transform(babelify.configure({
      presets: ['es2015', 'react']
    }))
    .require('./client/client.js', { entry: true })
    .bundle()
    .on('error', (err) => {
      console.log(err);
    })
    .on('end', () => {
      console.timeEnd();
    })
    .pipe(gulp.dest('dist/public/bundle.js'));

我收到以下错误:

[19:37:57] Finished 'lint' after 14 s
path.js:7
    throw new TypeError('Path must be a string. Received ' + inspect(path));
    ^

TypeError: Path must be a string. Received undefined
    at assertPath (path.js:7:11)
    at Object.resolve (path.js:1148:7)
    at DestroyableTransform.saveFile [as _transform] 

我尝试使用手动方式:

.pipe(fs.createWriteStream(`${__dirname}/dist/public/bundle.js`));

它不起作用。 但以下作品:

.pipe(fs.createWriteStream(`${__dirname}/dist/bundle.js`));

这里文件夹 'dist' 存在于目录中,但 'public' 不存在于 'dist'.
目录中 我认为这是原因,但我该如何解决它以将捆绑文件保存到 'dist/public'?

您的两次尝试因不同原因而失败。

您第一次尝试使用 gulp.dest() 失败,因为 browserify() returns 是一个简单的字符流,而 gulp.dest() 只能在 vinyl objects. You need to use the vinyl-source-stream 模块的流上工作将 char 流转换为 vinyl 流。之后 gulp.dest() 将工作并创建任何尚不存在的文件夹:

var browserify = require('browserify');
var source = require('vinyl-source-stream');

browserify({ debug: true })
  .transform(babelify.configure({
    presets: ['es2015', 'react']
  }))
  .require('./client/client.js', { entry: true })
  .bundle()
  .on('error', (err) => {
    console.log(err);
  })
  .on('end', () => {
    console.timeEnd();
  })
  .pipe(source('bundle.js')) 
  .pipe(gulp.dest('dist/public/'));

您的第二次尝试仅使用字符流,但失败了,因为 fs.createWriteStream() can only create the bundle.js file itself, not any of the necessary parent directories. You'll have to do that manually beforehand. I suggest the mkdirp 模块递归创建任意深度的目录结构(如果它们不存在):

var browserify = require('browserify');
var mkdirp = require('mkdirp');
var fs = require('fs');

mkdirp('dist/public/', function(err) {
  if (err) { /* handle error somehow */ }

  browserify({ debug: true })
    .transform(babelify.configure({
      presets: ['es2015', 'react']
    }))
    .require('./client/client.js', { entry: true })
    .bundle()
    .on('error', (err) => {
      console.log(err);
    })
    .on('end', () => {
      console.timeEnd();
    })
    .pipe(fs.createWriteStream('dist/public/bundle.js'));
});

您选择这两种解决方案中的哪一种取决于您,但如果这是您从 gulpfile 运行 获得的代码,那么我建议您使用第一种。