使用 webpack、ES6、ReactJS 导入 JavaScript 文件和调用函数

Posted

技术标签:

【中文标题】使用 webpack、ES6、ReactJS 导入 JavaScript 文件和调用函数【英文标题】:Import JavaScript file and call functions using webpack, ES6, ReactJS 【发布时间】:2016-11-22 21:10:35 【问题描述】:

尝试做一些我认为非常简单的事情。我想导入一个现有的 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;

只是想知道我必须做哪些神奇的事情才能完成这项工作。也许我只是错过了重点。该示例给出了错误“TypeError: _blah.blah is undefined”。

【问题讨论】:

如果没有您尝试导入的文件的示例,这是无法回答的。您发布的代码没有任何问题,但它是否有效取决于从blah.js 导出的内容。 如果您已命名导出 blah 对象,请签入 blah.js。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 【参考方案1】:

命名导出:

假设您创建了一个名为 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: export declarations may only appear at top level of a module 那么您可能正在导出其他块中的内容。读取错误时,您需要在顶层(即在任何块之外)执行此操作。 如何只导入 util 并调用 util.add()、util.multiply() 等函数? @jiawen 你可以这样做:import * as util from './utils.js'; (我也将这个添加到答案中)。 哦,我错过了。谢谢!【参考方案2】:
import * as utils from './utils.js'; 

如果做到以上几点,就可以将utils.js中的函数当作

utils.someFunction()

【讨论】:

以上是关于使用 webpack、ES6、ReactJS 导入 JavaScript 文件和调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React + ES6 + webpack 导入和导出组件?

从 Webpack ReactJS/ReactTS 项目导入/需要 NAPI 插件

reactjs学习--01

如何使用 webpack 从 React JS 中的外部 JS 文件导入对象

AngularJS 模块 + Webpack + ES6 导入 - 依赖注入和连接顺序问题

ES6 和 Webpack:导入不起作用