簡體   English   中英

節點模塊的根目錄

[英]root directory for node module

我有一個非常標准的節點模塊使用babel來轉換我們的代碼然后輸出到'lib'文件夾。 package.json將'main'指向'lib / index.js',以便人們可以只require('my-module')

但是,如果我有一個子目錄(例如my-module / server),那么當他們使用my-module時,他們必須執行require('my-module/lib/server') 我已經看到人們把post.buson復制到lib中的post構建步驟,但這對我來說只是感覺hacky和錯誤。 在npm中有沒有辦法指定一個主目錄 ,我的模塊的任何require()都會從該目錄開始? 然后我可以讓用戶在沒有lib部分的情況下需要('my-module / server')...

我認為最好的解決方案是你有一個主要的index.js和所有的子模塊,所以你可以做一些像require('your-module').server

沒有看到你的文件夾結構很難,但你可以:

  • 使用module.exports =導出babel輸出
  • 將其他文件符號鏈接到目錄中

的package.json

{ "main": "lib" }

LIB / index.js

module.exports = require('./path-to-transpiled-code.js');

// Now also export all the other stuff in this folder dynamically

fs.readdirSync(DIRECTORY_TO_EXPORT, function (err, files) {
  if (err) { throw err; }
  files.forEach(function (file) {
    if (file !== 'index.js') {
      fs.symlinkSync(path.join(__dirname, file), path.join(DIRECTORY_TO_EXPORT, file));
    }
  })
});

如果我的問題是正確的,那么你唯一需要的就是將你的模塊主路徑指向package.json。

{
   "main": lib/index.js 
}

其中index.js是模塊的主文件。 有關更多信息,請在此處查看npm文檔

讓我們假設你有一個包my-module ,里面你有一個子文件夾my-submodule 您的my-module/package.json文件將包含以下行:

{
    ...,
    "main": "lib/index.js",
    ...
}

這將允許您的包裹被線路所需

var myMod = require('my-module');

要允許對子模塊使用相同的語法,您所要做的就是將package.json文件放在子模塊文件夾中。 它應包含以下內容:

{
    "main": "lib/index.js"
}

之后,您可以使用簡單的require語法:

var mySubMod = require("my-module/my-submodule");

您有多種選擇如何實現目標。

將它全部導出到lib / index.js中

在主模塊的入口點,您可以導出要從模塊中顯示的所有內容。

  • +完全控制公共API的一部分以及被視為“私有”的內容
  • +使用ES2015模塊規格玩得非常好
  • -不滿足您要求組件( server )通過直接require()調用以及服務器模塊的路徑的要求

例:

'use strict'

// this is whatever is the primary export of your module - be it a
// function, object or anything else which can have other properties
// assigned to it
const main = require('./main')
const server = require('./server')

module.exports = main
module.exports.server = server
// ...

用法:

'use strict'

const mymodule = require('my-module')
const server = require('my-module').server
const { server } = require('my-module')

import { server } from 'my-module'

為根目錄中的組件創建條目文件

您可以為要在模塊的根文件夾中公開API的一部分公開的每個組件創建單獨的文件。

  • +滿足您通過特定路徑需要組件的要求
  • -結構略微復雜,每個公共組件需要額外的文件
  • -與ES2015模塊不兼容(您必須使用組件的完整路徑,不能使用解構語法)

示例文件夾結構:

my-module
├── lib
│   ├── index.js
│   └── server.js
└── server.js

my-module / server.js文件只指向實際的實現:

'use strict'

module.exports = require('./lib/server')

一般注意事項

應該注意的是,雖然技術上可行,但消費者依賴完整的模塊路徑並不是最佳選擇,因為文件夾和文件結構現在已成為API的一部分,因此移動文件突然發生了重大變化。 每當我發現自己需要以這種方式需要模塊的組件時,我就把它看作是在弄亂那個模塊的內部結構,並且我希望我的代碼能夠通過該模塊的補丁版本升級來實現收支平衡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM