node.js - nodejs,想自己实现fis的inline功能,写出了以下代码,有没有更简洁的写法??
怪我咯
怪我咯 2017-04-17 13:01:10
[Node.js讨论组]

代码逻辑

  1. 创建两个文件

  2. 读入final_file并将其内容放入finaldata

  3. 将finaldata进行处理,将其引入的src_file文件抽出

  4. 读入src_file,并将其值赋给finaldata

  5. 再将finaldata写入final_file

    var fs = require('fs');
    var finalData;
    var arrayFile =[];
    var arrayStr=[];
        fs.writeFile('src_file.js', 'fsdfsdfwsffffffffffffffffffffffffffffff', function(err, fd) {
                   console.log('create newe new_file');
        });
    
        fs.writeFile('final_file.js', '__inline("src_file.js")', function(err, fd) {
                   console.log('create newe new_file');
        });
    fs.readFile('final_file.js', 'utf8', function(err, data) {
            var finalData = data;
            arrayFile = findInlineArray(data);
                for(var i in arrayFile){
                    fs.readFile(arrayFile[i],"utf8",function(err, fd) {
                                finalData = fd;
                                    fs.writeFile('final_file.js', finalData, function(err, fd) {
                                               console.log('success');
                                    });
                    });
                }
    
               function  findInlineArray(data) {
                       var arrayFile = [];
                    var patt = /(__inline\(['"]).*(?=['"]\))/;
                    //但是这样的写法只能匹配出现一个inline的情况,
                    //需要改进
                    var result = patt.exec(data)[0].replace(patt.exec(data)[1],'');
                    var tempReadFile;
                    arrayFile.push(result);
                       return arrayFile;
               }
        });
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
PHP中文网

不介意用同步的话可以这样。


const fs = require('fs')

fs.readFile('final_file.js',(err,content) => {
    content = content.toString()
    
    content = content.replace(/_inline\(\s*["']([^"']+)["']\s*\)/g, (str,script) => {
    
        if (fs.existsSync(script)) {
            try {         
                return fs.readFileSync(script,'utf8')
            } catch(err) {
                return str
            }
        }
        
        return str
    })
    
    fs.writeFile('final_file.js', content)
})

不喜欢同步的话,可以这样

const fs = require('fs')

var readFile = script => {
    return new Promise((resolve,reject) => {
        fs.readFile(script, (err,content) => {
            if (err) {
                return resolve(null)
            }
            
            resolve(content)
        })
    })
}

readFile('final_file.js')
    .then(content => {
        content = content.toString()
        
        var promises = []
        
        const INLINE_REG = /_inline\(\s*["']([^"']+)["']\s*\)/g
        
        content.replace(INLINE_REG , (str,script) => {
            promises.push(readFile(script))
        })
        
        return Promise.all(promises)
            .then(contents => {
                var i = 0
                content = content.replace(INLINE_REG , (str, script) => {              
                    return (contents[i++] || str).toString()
                })
                
                return content
            })        
    })
    .then(content => {
        fs.writeFile('final_file.dist.js', content)
    })    
ringa_lee

es7 async/await

阿神

最近刚好在学习nodeJS stream,所以借用楼上同学 @泡泡 的replace正则,用stream方式写了一个答案:

var fs = require('fs');
var replaceStream = require('replacestream')

fs.writeFileSync('src_file.js', 'This is src_file.js content');
fs.writeFileSync('final_file.js', '_inline("src_file.js")');

fs.createReadStream('final_file.js')
   .pipe(replaceStream(/_inline\(\s*["']([^"']+)["']\s*\)/g, function(str, script){
         if (fs.existsSync(script)) {
            try {
                return fs.readFileSync(script, 'utf8');
            } catch(err) {
                return str;
            }
         }

         return str;
      }))
   .pipe(fs.createWriteStream('final_file.js.tmp'));

或者自己实现一个transform的stream,这样自己就可以在stream中随意定制了。

补充,这显然不是一个最佳方法,最好是可以在_transform方法中分段替换后,进行push,但是牵扯到被替换的关键字有可能被分为两段,这是一个难点,正在想办法,当然你可以使用上面的replacestream去处理。 stream方式在处理大文件时,优势是很明显的。

var stream = require('stream'),
    util = require('util'),
    fs = require('fs');

var Transform = stream.Transform;

var Inline = function (options) {
  Transform.call(this, options);
  this._text = '';
};

util.inherits(Inline, Transform);

Inline.prototype._transform = function (chunk, encoding, callback) {
  var text = chunk.toString('utf8');
  this._text += text;
  callback();
};

Inline.prototype._flush = function (callback) {
  this._text = this._text.replace(/_inline\(\s*["']([^"']+)["']\s*\)/g, function(str,script) {
        if (fs.existsSync(script)) {
            try {
                return fs.readFileSync(script,'utf8')
            } catch(err) {
                return str
            }
        }
        return str
  });
  this.push(this._text, 'utf8');
  callback();
};

fs.writeFileSync('src_file.js', 'This is src_file.js content');
fs.writeFileSync('final_file.js', '_inline("src_file.js")');

fs.createReadStream('final_file.js')
   .pipe(new Inline()).pipe(fs.createWriteStream('final_file.js.tmp'));
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号