如何从node_modules获取节点包消费者目录

How to get node package consumer directory from node_modules?

本文关键字:节点 消费者 获取 modules node      更新时间:2023-09-26

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

以下是创建者中的索引.js:

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

和指数.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:'' 中创建文件夹不是相对于消费者。然后我尝试将__dirname或 cwd 传递到一个config对象。

// 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

我正在使用带有 babel 的 webpack 来打包创建者,消费者中的普通 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'
  }
};

正确的解决方案是在配置中添加以下行:

target: 'node'

这将使 Webpack 忽略像 fsmkdirp 这样的模块以及其他一些模块。

现在不再需要指定externals


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

只需将mkdirp添加到外部,它就会解决您的问题:

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