如何从 node_modules 获取节点包消费者目录?
How to get node package consumer directory from node_modules?
我正在尝试创建一个简单的节点模块,该模块在使用它的应用程序中创建一组文件夹。我导出了一个创建文件夹的简单 createLayout
函数。我将更改推送到 git 并从另一个文件夹执行了 npm i
。为了便于解释,让我们调用模块 creator
和 consumer
。当我尝试在消费者中调用 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:\ 中创建一个与消费者无关的文件夹。我在各种模块中搜索了 bit like 以查看它们在读取配置文件时的表现,例如 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
我正在使用带有 babel 的 webpack 来打包消费者中的创建者和纯 js。我不知道我做错了什么。我对 nodejs 的工作方式还很陌生。
更新
我注意到只有在我使用 webpack 构建 creator 时才会出现这种情况。一个简单的 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 忽略 fs
和 mkdirp
以及其他一些模块。
现在不再需要指定externals
。
之前给出的错误解决方案:
只需将 mkdirp
添加到外部,它将解决您的问题:
externals: {
fs: 'fs',
mkdirp: 'mkdirp'
}
我正在尝试创建一个简单的节点模块,该模块在使用它的应用程序中创建一组文件夹。我导出了一个创建文件夹的简单 createLayout
函数。我将更改推送到 git 并从另一个文件夹执行了 npm i
。为了便于解释,让我们调用模块 creator
和 consumer
。当我尝试在消费者中调用 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:\ 中创建一个与消费者无关的文件夹。我在各种模块中搜索了 bit like 以查看它们在读取配置文件时的表现,例如 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
我正在使用带有 babel 的 webpack 来打包消费者中的创建者和纯 js。我不知道我做错了什么。我对 nodejs 的工作方式还很陌生。
更新
我注意到只有在我使用 webpack 构建 creator 时才会出现这种情况。一个简单的 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 忽略 fs
和 mkdirp
以及其他一些模块。
现在不再需要指定externals
。
之前给出的错误解决方案:
只需将 mkdirp
添加到外部,它将解决您的问题:
externals: {
fs: 'fs',
mkdirp: 'mkdirp'
}