简体   繁体   English

webpack构建后,节点模块不起作用

[英]Node module doesn't work after webpack build

I'm having some problems with building own node module for my react apps. 我在为自己的应用程序构建自己的节点模块时遇到一些问题。 I need this to prepare some common functions for couple of my react apps and I want them to be placed in separated node module. 我需要为一些我的React应用程序准备一些通用功能,并且希望将它们放置在单独的节点模块中。 So, I created the module and it looks like that: -src --index.js -package.json 因此,我创建了模块,它看起来像这样: -src --index.js -package.json

index.js file: index.js文件:

export const myFunction = () => {
  return 'Some nice text';
}

package.json package.json

{
  "name": "mymodule",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "test": "npm test"
  },
  "author": "",
  "license": "ISC",
}

In the react app (consumer project) I'm importing the function: 在react应用(消费者项目)中,我正在导入功能:

import { myFunction } from 'mymodule';

console.log(myFunction());

Till now, everything works fine. 到现在为止,一切正常。 In the console I see the text Some nice text . 在控制台中,我看到Some nice text Now, I'm trying to build my module with webpack 4 so I updated my package.json file: 现在,我正在尝试使用webpack 4构建模块,因此我更新了package.json文件:

{
  "name": "mymodule",
  "version": "1.0.0",
  "description": "",
  "main": "dist/main.js", <-- this is the file build by webpack
  "scripts": {
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.21.0",
    "webpack-cli": "^3.1.2"
  }
}

and rebuild both projects. 并重建两个项目。 Then I see in the console following error: 然后我在控制台中看到以下错误:

Uncaught TypeError: (0 , _mymodule.myFunction) is not a function
    at eval (index.jsx:47)
    at Object../src/index.jsx (main.js:8559)
    at __webpack_require__ (main.js:20)
    at eval (webpack:///multi_(:8080/webpack)-dev-server/client?:3:18)
    at Object.0 (main.js:9057)
    at __webpack_require__ (main.js:20)
    at main.js:84
    at main.js:87

EDIT: I added babel as suggested and turned off minimization. 编辑:我根据建议添加了babel并关闭了最小化功能。 This is how my dist/main.js file looks like: 这是我的dist/main.js文件的样子:

/******/ (function(modules) { // webpackBootstrap
/******/    // The module cache
/******/    var installedModules = {};
/******/
/******/    // The require function
/******/    function __webpack_require__(moduleId) {
/******/
/******/        // Check if module is in cache
/******/        if(installedModules[moduleId]) {
/******/            return installedModules[moduleId].exports;
/******/        }
/******/        // Create a new module (and put it into the cache)
/******/        var module = installedModules[moduleId] = {
/******/            i: moduleId,
/******/            l: false,
/******/            exports: {}
/******/        };
/******/
/******/        // Execute the module function
/******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/        // Flag the module as loaded
/******/        module.l = true;
/******/
/******/        // Return the exports of the module
/******/        return module.exports;
/******/    }
/******/
/******/
/******/    // expose the modules object (__webpack_modules__)
/******/    __webpack_require__.m = modules;
/******/
/******/    // expose the module cache
/******/    __webpack_require__.c = installedModules;
/******/
/******/    // define getter function for harmony exports
/******/    __webpack_require__.d = function(exports, name, getter) {
/******/        if(!__webpack_require__.o(exports, name)) {
/******/            Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/        }
/******/    };
/******/
/******/    // define __esModule on exports
/******/    __webpack_require__.r = function(exports) {
/******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/        }
/******/        Object.defineProperty(exports, '__esModule', { value: true });
/******/    };
/******/
/******/    // create a fake namespace object
/******/    // mode & 1: value is a module id, require it
/******/    // mode & 2: merge all properties of value into the ns
/******/    // mode & 4: return value when already ns object
/******/    // mode & 8|1: behave like require
/******/    __webpack_require__.t = function(value, mode) {
/******/        if(mode & 1) value = __webpack_require__(value);
/******/        if(mode & 8) return value;
/******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/        var ns = Object.create(null);
/******/        __webpack_require__.r(ns);
/******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/        return ns;
/******/    };
/******/
/******/    // getDefaultExport function for compatibility with non-harmony modules
/******/    __webpack_require__.n = function(module) {
/******/        var getter = module && module.__esModule ?
/******/            function getDefault() { return module['default']; } :
/******/            function getModuleExports() { return module; };
/******/        __webpack_require__.d(getter, 'a', getter);
/******/        return getter;
/******/    };
/******/
/******/    // Object.prototype.hasOwnProperty.call
/******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/    // __webpack_public_path__
/******/    __webpack_require__.p = "";
/******/
/******/
/******/    // Load entry module and return exports
/******/    return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "myFunction", function() { return myFunction; });
function myFunction() {
  return 'aaaaaabbbb';
}

Has somebody faced similar issue? 有人遇到过类似的问题吗? Thanks in advance! 提前致谢!

The problem is with build config. 问题出在构建配置上。 This build file doesn't export the function outside. 此构建文件不会将函数导出到外部。 To do it, let's add output key to webpack config: 为此,我们将output密钥添加到webpack配置中:

module.exports = {
    ...
    output: {
        library: 'modulename',
        libraryTarget: 'umd',
        filename: 'main.js',
    },
    ...
};

Then, the module functions will be exported outside. 然后,模块功能将导出到外部。

Try this in your index.js 在您的index.js中尝试

export function myFunction() {
    return 'Some nice text';
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM