웹팩 원본의 NodeEnvironmentPlugin 모듈 총람 분석(6)

2585 단어
웹팩에 들어갑니다.js
// ,new Compiler 
compiler = new Compiler(options.context);
//  options 
compiler.options = options;
new NodeEnvironmentPlugin().apply(compiler);

compiler가 너무 복잡해서 NodeEnvironmentPlugin을 먼저 볼게요.

const NodeWatchFileSystem = require("./NodeWatchFileSystem");
const NodeOutputFileSystem = require("./NodeOutputFileSystem");
const NodeJsInputFileSystem = require("enhanced-resolve/lib/NodeJsInputFileSystem");
const CachedInputFileSystem = require("enhanced-resolve/lib/CachedInputFileSystem");

class NodeEnvironmentPlugin {
    apply(compiler) {
        //  
        compiler.inputFileSystem = new CachedInputFileSystem(
            new NodeJsInputFileSystem(),
            60000
        );
        //  
        const inputFileSystem = compiler.inputFileSystem;
        //  , compiler 
        compiler.outputFileSystem = new NodeOutputFileSystem();
        //  , , compiler 
        compiler.watchFileSystem = new NodeWatchFileSystem(
            compiler.inputFileSystem
        );
        //  before-run
        compiler.hooks.beforeRun.tap("NodeEnvironmentPlugin", compiler => {
            if (compiler.inputFileSystem === inputFileSystem) inputFileSystem.purge();
        });
    }
}
module.exports = NodeEnvironmentPlugin;

플러그인 NodeJsInputFileSystem을 엽니다.js

"use strict";

const fs = require("graceful-fs");

class NodeJsInputFileSystem {
     // 
    readdir(path, callback) {
        fs.readdir(path, (err, files) => {
            callback(err, files && files.map(file => {
              //  NFC 
                return file.normalize ? file.normalize("NFC") : file;
            }));
        });
    }
     // 
    readdirSync(path) {
        const files = fs.readdirSync(path);
        return files && files.map(file => {
            return file.normalize ? file.normalize("NFC") : file;
        });
    }
}

const fsMethods = [
    "stat",
    "statSync",
    "readFile",
    "readFileSync",
    "readlink",
    "readlinkSync"
];
//  fs 
for(const key of fsMethods) {
    Object.defineProperty(NodeJsInputFileSystem.prototype, key, {
        configurable: true,
        writable: true,
        value: fs[key].bind(fs)
    });
}

module.exports = NodeJsInputFileSystem;

graceful-fs는 node 원생 fs를 한 겹 봉하여 더욱 우아하게 한다
전체적으로 보면 Node Environment Plugin 이 모듈은 파일을 처리하고 다시 node를 봉인한 것이다.js는 fs 모듈을 처리했습니다. 파일의 입력, 출력, 캐시, 감청...

좋은 웹페이지 즐겨찾기