2017-09-11 33 views
0

當創建一個新公共管理軟件包中設置的相對路徑的分辨率,這是很常見的,方便構建它像這樣:如何基於「DIST」文件夾

root 
/dist 
/src 
/package.json 

其中package.json

{ 
    "main": "dist/index.js" 
    "files": [ "dist" ] 
} 

這種方法的缺點是,當消費者想要使用相對路徑來請求文件時,它需要包含dist文件夾。例如。 const abc = require('my-package/dist/x/y/abc');

有沒有辦法告訴NodeJS根據path.dirname(main)或類似的東西來解析相對路徑?

更新:澄清,這與相對/深度分辨率有關,而不是關於ES6中的出口吊裝。 這是一個有爭議的話題,應該這樣做,因爲消費者是耦合到包的內部文件夾結構。

更新2:我想實現的是「子模塊」(類似於命名空間)的概念。例如,我的文件夾結構是這樣的:

root 
/dist 
    /testUtil.js 
    /index.js 

testUtil.js包含有用的功能進行測試。由於它沒有用於正常使用,我不想將它們導出到頂層。中即代替:

// index.js 
export * from './testUtil' 

我會做:

// index.js 
import * as testUtil from './testUtil' 
export { testUtil } 

然而,仍處於頂層暴露testUtil模塊命名空間,這是很難用:

// consuming.js 
import { testUtil } from 'my-package' 
const { funcA, funcB } = testUtil 

如果我可以在相對路徑下「拖拉」它會更好:

// consuming.js 
import { funcA, funcB } from 'my-package/testUtil' 

目前,沒有解決「DIST」的問題,我必須這樣做,而不是:

// consuming.js 
import { funcA, funcB } from 'my-package/dist/testUtil' 
+0

你可以發佈'dist'目錄。 –

+0

你的意思是在'dist'內創建'package.json'的副本嗎?這意味着我必須同步'dependencies'並複製部分腳本,比如'install','prepare','publish','version'等等。 – unional

+1

是的。這會更麻煩,但它會給你一個更「清潔」的包。你可能只需要一個'package.dist.json'來複制並重命名爲構建步驟。儘管分發版本的腳本可能會少得多,它真的只需要一個安裝和運行腳本。 –

回答

0

通常的方法是出口的東西很多,從你的「DIST/index.js」中的文件,而不是讓人們導入其他文件。你可以再出口的東西是這樣的:

export { default as Something } from './something.js' 
export SomethingElse from './something-else.js' 

看到這個答案更多:ES6, how can you export an imported module in a single line?

+0

是的。這對ES6來說是一個很好的方法。 OP是關於相對路徑分辨率,這是一個有爭議的主題。 – unional

2

您可以設置NODE_PATH環境變量,而且應該做的伎倆:

export NODE_PATH=./dist 

有是一些其他的模式,你可以嘗試here

+0

這是一個全球env和應用程序。問題是模塊。但爲鏈接+1。 :) – unional

0

要解決dist文件夾問題,您可以將dist目錄作爲獨立軟件包發佈。這將涉及維護一個單獨的package.json(與您的源代碼包相比,它很可能是一個非常苗條的package.json)。

對於子模塊/命名空間問題,我沒有看到問題。

鑑於目錄結構包:

root 
/index.js 
/testUtils.js 
/utilities 
    /index.js 
    /calculator.js 
    /worker.js 

您可以require("root")訪問正常頂級出口。

您可以通過require("root/testUtils")訪問testUtils

您可以通過require("root/utilities")訪問頂級utilities模塊。您可以使用require("root/utilities/calculator")訪問calculator

您只需以您想要向消費者公開的方式維護此結構即可。

相關問題