Імпортуйте файли 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.