javascript - 如何从node_modules获取 Node 包消费者目录?

标签 javascript node.js webpack packaging

我正在尝试创建一个简单的 Node 模块,该模块在使用它的应用程序中创建一组文件夹。我导出了一个用于创建文件夹的简单 createLayout 函数。我将更改推送到 git 并从另一个文件夹执行了 npm i 。为了解释起见,我们将模块称为 creatorconsumer。当我尝试在消费者中调用 createLayout 时,我遇到了几个问题。我在 E:\ 驱动器中。

下面是创建者中的index.js:

import {sync} from 'mkdirp';

export function createLayout(config) {
  sync('./folder1');
}

消费者中的index.js:

var createLayout = require('creator').createLayout;
createLayout();
// with config createLayout({path: __dirname})

这会导致在 E:\中创建一个与消费者无关的文件夹。所以我尝试包括 __dirname:

sync(__dirname + '/folder1');

同样,这还会在 E:\中创建一个与消费者无关的文件夹。我在各种模块中进行了类似的搜索,以了解它们在读取配置文件时的表现,例如 webpack 使用 process.cwd。所以我也尝试了一下。

sync(process.cwd() + '/folder1');

同样,会导致在 E:\中创建一个与消费者无关的文件夹。然后我尝试通过 config 对象传递 __dirname 或 cwd。

// get __dirname from the `consumer` in config.path
sync(config.path + '/folder1');

但最终出现以下错误:

Error: EPERM: operation not permitted, mkdir 'E:\'

我尝试记录创建者和消费者中的所有值:

console.log(__dirname, process.cwd(), config.path)
// creator: / / E:\projects\consumer
// consumer: E:\projects\consumer E:\projects\consumer E:\projects\consumer

我使用 webpack 和 babel 来打包创建者,消费者中的普通 js。我不知道我做错了什么。我对 Nodejs 的工作方式还很陌生。

更新

我注意到只有当我使用 webpack 构建创建器时才会发生这种情况。一个简单的 module.exports 可以正常工作,正如任何人所期望的那样。所以我包括了我的 webpack 配置文件:

module.exports = {
  entry: [
    './index.js'
  ],
  output: {
    filename: 'creator.js',
    path: __dirname + '/dist',
    library: 'creator',
    libraryTarget: 'umd'
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel'
      }
    ]
  },
  externals: {
    fs: 'fs'
  }
};

最佳答案

正确的解决方案是在 config 中添加此行:

target: 'node'

这将使 webpack 忽略诸如 fsmkdirp 等模块。

现在不再需要指定外部

<小时/>

之前给出的错误解决方案:

只需将 mkdirp 添加到外部即可解决您的问题:

  externals: {
    fs: 'fs',
    mkdirp: 'mkdirp'
  }

关于javascript - 如何从node_modules获取 Node 包消费者目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36073874/

相关文章:

javascript - 无法使用 jQuery 禁用 Twitter Bootstrap 按钮?

javascript - NodeJS/ExpressJS 中基于文件的路由

javascript - AngularJS 类型错误 : $resource is not a function

node.js - pm2:在不自动启动应用程序的情况下加载 processes.json

javascript - 在javascript中读取文本文件的第一行

javascript - 通过 Angular JS 处理 APlayer - 动态播放音乐

javascript - 谷歌地图不会显示在浏览器上

webpack - Vuetify 2.1 和 Webpack 的编译时间极长

javascript - Handlebars.js 和 Webpack - 预编译模板

javascript - 如何在 webpack 中使用 noParse?