Імпортуйте файли JavaScript та функції виклику за допомогою webpack, ES6, ReactJS


77

Спроба зробити щось, на мій погляд, була б дуже простою. Я хотів би імпортувати існуючу бібліотеку JavaScript, а потім викликати її функції. Так, наприклад, я хотів би імпортувати blah.js, а потім викликати blah ().

import React from 'react';
import {blah} from 'blah/js/blah.js';

class MyClass extends React.Component {
    constructor() {
        super();
    }

    componentDidMount() {
        window.addEventListener('resize', this.handleResize);
    }

    componentWillUnmount() {
        window.removeEventListener('resize', this.handleResize);
    }

    handleResize() {
        blah.blah();
    }

    render() {
          ....
    }
}

export default MyClass;

Просто цікаво, яку чарівну комбінацію речей я повинен зробити, щоб ця робота вийшла. Можливо, я просто втрачаю суть. Приклад дає помилку "Помилка типу: _blah.blah не визначено".


1
Без прикладу файлу, який ви намагаєтеся імпортувати, це неможливо відповісти. У коді, який ви опублікували, немає нічого поганого, але чи працює він, залежатиме від того, з чого експортується blah.js.
loganfsmyth

Перевірте, blah.jsчи вказали ви експорт blahоб'єкта. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Everettss

Відповіді:


166

Названий експорт:

Скажімо, ви створюєте файл із назвою utils.jsутиліта з функціями, які ви хочете зробити доступними для інших модулів (наприклад, компонента React). Тоді ви зробите кожну функцію іменованим експортом :

export function add(x, y) {
  return x + y
}

export function mutiply(x, y) {
  return x * y
}

Якщо припустити, що utils.js знаходиться в тому ж каталозі, що і ваш компонент React, ви можете використовувати його експорт таким чином:

import { add, multiply } from './utils.js';
...
add(2, 3) // Can be called wherever in your component, and would return 5.

Або, якщо хочете, розмістіть весь вміст модуля у загальному просторі імен:

import * as utils from './utils.js'; 
...
utils.multiply(2,3)

Експорт за замовчуванням:

Якщо у вас, з іншого боку, є модуль, який робить лише одне (це може бути клас React, звичайна функція, константа або щось інше) і ви хочете зробити цю річ доступною для інших, ви можете використовувати експорт за замовчуванням . Скажімо, у нас є файл log.jsіз лише однією функцією, яка виходить із будь-якого аргументу, з яким він викликається:

export default function log(message) {
  console.log(message);
}

Тепер це можна використовувати так:

import log from './log.js';
...
log('test') // Would print 'test' in the console.

Вам не потрібно викликати його logпри імпорті, ви можете насправді назвати це як завгодно:

import logToConsole from './log.js';
...
logToConsole('test') // Would also print 'test' in the console.

Комбіновані:

Модуль може мати як експорт за замовчуванням (макс. 1), так і іменований експорт (імпортований по одному або *з використанням псевдоніма). React насправді має це, розглянемо:

import React, { Component, PropTypes } from 'react';

Має сенс, але тепер я отримую такі помилки: SyntaxError: декларації про експорт можуть з'являтися лише на верхньому рівні модуля
user1686620

Тоді ви, ймовірно, експортуєте речі всередину інших блоків. Коли помилка читається, вам потрібно робити це на верхньому рівні (тобто поза будь-якими блоками).
tobiasandersen

Як я можу імпортувати лише функції util і викликати такі, як util.add (), util.multiply ()?
jiawen

@jiawen Ви можете зробити: import * as util from './utils.js'; (Я також додав це до відповіді).
tobiasandersen,

о, я пропустив це. Дякую!
jiawen

4
import * as utils from './utils.js'; 

Якщо ви зробите вищезазначене, ви зможете використовувати функції в utils.js як

utils.someFunction()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.