> For the complete documentation index, see [llms.txt](https://ayugioh2003.gitbook.io/front2end/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayugioh2003.gitbook.io/front2end/shi-zuo/learnyounode/6----make-it-modular.md).

# 6 -  Make it Modular

這個題目如果我沒先偷看答案的話，真的是完全沒有概念啊 ...，所以我偷看了(茶)

第六題和第五題要求差不多，都是要篩選資料夾中有某個副檔名的檔案出來。這題要拆成兩個檔案，一個是主要用來執行的 js 檔，一個是變成模組、用來讓執行的 js 載入的檔案

首先是執行程式。執行程式一開始要先設定三個東西:

* 載入負責 filter 的模組
* 抓取 `node MakeModule dir filterstr`的第二個參數，也就是 dir
* 抓取 `node MakeModule dir filterstr`的第三個參數，也就是 filterstr

之後，就是利用 filterFn 塞選出有 filterStr 的檔案，再一個一個印出在此 list 裡面的 file 檔名

```javascript
// 主程式，要載入 filter 的模組

var filterFn = require( './6-myModule.js' )
var dir = process.argv[2]
var filterStr = process.argv[3]


// 執行 filterFn 函式 

filterFn ( dir, filterStr, function ( err, list ) {

    // 報錯
    if (err)
        return console.error( "There was an error:", err )

    // 列印符合的篩選檔案
    list.forEach ( function (file) {
        console.log(file)
    })
}  
)
```

模組的部份，目的是要篩選出某個資料夾中，符合某個副檔名的全部檔案

首先要得到某個資料夾的全部清單，而這可以透過 fs.readdir( dir, filterstr, callback) 函式找到。為此，我們要

* 載入 fs 模組: fs = require('fs')
* 了解 fs.readdir 的參數有 ( dir, fuction(err, list) )

再來，要進行實質的篩選。官方解答提供了一個篩選函式: Array.filter( function(){condition} )。所以接下來要

* 先建立一個可以傳到執行程式的 var file = list.filter( function(){} )
* 在 callback 函式為 file 設定條件並傳回: return path.extname( file ) == ( "."+ filterStr )

最後，要把整個程式包成 module 方便外包出去，讓執行程式可以使用，而也要能接受來自執行程式的參數: dir, filterStr

* module.exports = function ( dir, filterStr, callback ){ }

```javascript
// filter 的模組 

var fs = require('fs')
var path = require('path')

module.exports = function ( dir, filterStr, callback ){

    fs.readdir( dir, function(err, list) {

        // 如果錯，就報錯    
        if (err)
            return callback(err)

        // filter file has ext
        list = list.filter(function (file) {
            return path.extname( file ) == ( "."+ filterStr )  
        } )

        // callback    
        callback(null, list)
    })

}
```

* [learnyounode Lesson 6 – Make it Modular | Joe Creager](http://joecreager.com/learnyounode-lesson-6-make-it-modular/)

`Array.forEach(callback)`

* [Array.prototype.forEach() - JavaScript | MDN](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)

`Array.filter(callback )`

* [Array.prototype.filter() - JavaScript | MDN](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
* [Mr.Q 程式手劄: 讓 Vim 跟與你的系統剪貼簿 (clipboard) 共舞](http://littleqnote.blogspot.com/2013/09/vim-clipboard.html)
* [Vim 中如何全選複制粘貼 - 造夢先森 Kai 的專欄 - 博客頻道 - CSDN.NET](http://blog.csdn.net/qq_15437629/article/details/47152425)
* [\[VIM\] 如何做全選 + 複製 - Mr. 一顆痣 a.k.a. bigd - 工程屍的日子](http://iambigd.blogspot.com/2014/02/vim.html)
