Browserify需要 - 内联方式。如何?

时间:2018-04-03 23:23:56

标签: javascript node.js inline browserify

是否有可能使用Browserify将一个文件包含到另一个文件中? 我的意思是不是标准的Browserify行为,而是在特定的地方将一个文件粘贴到另一个文件中。

file1.js

console.log("abc");

file2.js

requirePaste("file1.js");
console.log("def");

output.js

console.log("abc");
console.log("def");

我需要它将ES6类传播到像这种模式的多个文件中:

ObjectManager.js
ObjectManager_Events.js
ObjectManager_Rendering.js

这些文件大约是一个类。所以我可以做这样的事情:

class ObjectManager {
    constructor() {
    }

    requirePaste("./ObjectManager_Events");
    requirePaste("./ObjectManager_Rendering");
}

修改

我为Browserify创建了一个简单的转换插件,效果很好。虽然它不能与Watchify一起工作但有一个问题。这是因为内联所需文件不被视为被监视。关于如何解决这个问题的任何想法?

const through = require('through2');
const fs = require('fs');
const path = require('path');

const regex = /require\([\s]*\/\*inline\*\/[\s]*"(.+)"\)/g;

function process(pathToFile, contents) {
  while ( (occurence = regex.exec(contents)) ) {
    contents = processOne(pathToFile, contents, occurence);
  }

  return contents;
}

function processOne(pathToFile, contents, occurence) {
  const dir = path.dirname(pathToFile);

  const includePath = occurence[1] + ".js";

  const range = [occurence.index, occurence.index+occurence[0].length-1];

  const pathToInnerFile = dir + "/" + includePath;
  var innerContents = fs.readFileSync(pathToInnerFile, 'utf8');

  innerContents = process(pathToInnerFile, innerContents);

  var output = "";

  output += contents.substring(0, range[0]);

  output += innerContents;

  output += contents.substring(range[1]+1);

  return output;
}

module.exports = function(pathToFile) {
  return through(
    function(buf, enc, next) {
      var result = process(pathToFile, buf.toString('utf8'));

      this.push(result);
      next();
    }
  );
};

1 个答案:

答案 0 :(得分:0)

这就是诀窍:

基本上我们通过发出'file'事件告诉Watchify有关文件。

const includedFiles = [];

function process(pathToFile, contents) {
  includedFiles.push(pathToFile);

  while ( (occurence = regex.exec(contents)) ) {
    contents = processOne(pathToFile, contents, occurence);
  }

  return contents;
}

...

module.exports = function(pathToFile) {
  return through(
    function(buf, enc, next) {
      var result = process(pathToFile, buf.toString('utf8'));

      this.push(result);

      includedFiles.forEach((filePath) => this.emit("file", filePath));
      includedFiles.length = 0;

      next();
    }
  );
};