2016-06-18 82 views
2

流星應用程序的目錄佈局:從包中訪問流星應用程序的導入目錄?

imports/ 
    api/ 
    collections/ 
     MyCollectionFile.js 

packages/ 
    mypackage/ 
     mypackageMain.js 

我可以從包文件導出任何東西,並用它在應用程序中,這是確定。但是如何在包裝中使用「導入」,就像其他方式一樣?

// mypackageMain.js 
if (Meteor.isServer) { 
    require ('/imports/api/collections/MyCollectionFile.js'); 
}; 

OR

import '/imports/api/collections/MyCollectionFile.js'; 

我嘗試使用路徑」 ../../imports/api/collections/MyCollectionFile.js'但它根本不起作用。我無法從包中訪問此文件。

我得到兩個進口下列錯誤和要求:

W20160618-23:25:59.486(3)? (STDERR) Error: Cannot find module '../../imports/api/collections/MyCollectionFile.js' 
W20160618-23:25:59.487(3)? (STDERR)  at require (packages/modules-runtime/.npm/package/node_modules/install/install.js:85:1) 
+1

這種違背軟件包自包含的原則。您可以從包中導出一個函數,該函數接受來自應用程序的某個符號,而不是從包中導入它。它使它更便於攜帶。 – MasterAM

+0

@MasterAM你是對的。這是一項安全措施。謝謝。 – cenk

回答

2

想通了,這是不可能的。

但是,將集合移動到包並導出它們會使集合可供其他包和應用程序使用。

1

我也一直在解決這個問題,並找到了兩個解決方案,但都是次級的。

  1. 安裝你想要導入的東西作爲npm包。 $npm install --save ./imports/<the thing>。使用npm link創建要導入的內容的鏈接。

這兩種解決方案都要求您在要導入的目錄中有一個package.json,這兩個解決方案都不會傳輸代碼,只是針對提供的節點版本運行它。

對於transpile問題的一個可能的解決方案是使用一個加載器插件,或者以某種方式提供一個額外的配置給System.js,告訴它在導入時傳輸代碼。

+0

謝謝你的回答。但這似乎對我來說太過於矯枉過正了:) – cenk

相關問題