2017-01-09 4 views
0

У меня есть файл JavaScript, который содержит следующее:Как импортировать пространство имен?

const api = { 
    call(type, url, data) { 
    console.log(type + "bar"); 
    }, 

    get(url, query) { 
    this.call("foo"); 
    } 
} 

Я желающий иметь возможность вызывать api.get() по нескольким различным файлам где это необходимо, но у меня возникают проблемы с импортом этого.

  1. Загрузка файла в одиночку через import дает мне ReferenceError при попытке получить доступ к api переменной:

    import "services/api.js"; 
    console.log(api); 
    

    Uncaught ReferenceError: api is not defined

  2. Предоставление импорта имя (из api) возвращает объект, но он не имеет внутренних методов:

    import api from "../../services/api.js"; 
    console.log(api); 
    console.log(api.get); 
    

    Object {}
    undefined

Что я делаю неправильно?

ответ

2

api.js ничего не экспортирует. Вы должны переписать его экспортировать каждую из этих функций:

export function call(type, url, data) { 
    console.log(type + "bar"); 
} 
export function get(url, query) { 
    call("foo"); 
} 

(что гораздо лучше, чем по умолчанию, экспортирование api литерал объекта)

, а затем вы можете использовать его как

import * as api from "../../services/api.js"; 
console.log(api); 
console.log(api.get); 
+0

Спасибо. Вы говорите, что гораздо лучше сделать это так, но почему это так? –

+0

Neater, более удобный синтаксис и большая гибкость при импорте. – Bergi

+1

Это имеет смысл, поэтому мне не нужно импортировать функции, которые не требуются. Отлично! –

1

Вы должны экспортировать API:

const api = ... 

export default api; 
2

Во-первых, вы должны экспортировать его, как таковой:

const api = { 
    call(type, url, data) { 
    console.log(type + "bar"); 
    }, 

    get(url, query) { 
    this.call("foo"); 
    } 
} 

export {api} 

И затем, импортировать его:

import {api} from './path/to/api' // no .js 

Этот подход используется при экспорте нескольких элементов (функций, классов, переменных) из одного файла. Если в вашем случае api единственный элемент, который вы экспорт, вы можете использовать default ключевое слово, и вы больше не нужны использовать почести во время импорта:

const api = { 
    call(type, url, data) { 
    console.log(type + "bar"); 
    }, 

    get(url, query) { 
    this.call("foo"); 
    } 
} 

export default api 

и

import api from './path/to/api' 

Хороший удачи!

+0

Aha! Большое спасибо. Я был уверен, что это было очень просто, что мне не хватало. –

+0

Добро пожаловать! – motanelu

+0

[Не использовать литералы объектов по умолчанию] (http://stackoverflow.com/q/29893591/1048572)! – Bergi

0

Обратите внимание: экспорт/импорт - это спецификация модуля ES6. Для сред Node/CommonJS без каких-либо транспилеров это будет

// export 
module.exports.api = api 

// or 
module.exports = { api: api } ... 


// import 
var module = require(....) 
Смежные вопросы