path.join in require 语句

use*_*355 12 javascript dynamic node.js webpack

我尝试Path.join在这样的require语句中使用:

import Path from 'path'

const assetPath = Path.join(process.cwd(), `./lib/asset-manifest.json`)

console.log(assetPath)
'/home/dev/Website/lib/asset-manifest.json'

console.log(
  assetPath === '/home/dev/Website/lib/asset-manifest.json'
)
true

const assets = require(assetPath)
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

Error: Cannot find module '/home/dev/Website/lib/asset-manifest.json'
Run Code Online (Sandbox Code Playgroud)

虽然文件在那里并且require如果我手动将字符串放入其中可以工作:

const assets = require('/home/dev/Website/lib/asset-manifest.json')
Run Code Online (Sandbox Code Playgroud)

所以,我不知道为什么没有Path.join在工作require

此致

Dal*_*ker 2

import path from 'path';

// you can use process.cwd() if you want
const assetPath = path.join(path.dirname(require.main.filename), `lib/asset-manifest`);

const test = () => {
  var assets = require(assetPath);
  console.log(assets);
};

export default test();
Run Code Online (Sandbox Code Playgroud)

您需要将 require 包围在函数内。否则 require 将在路径分配给 assetPath 变量之前运行。这是因为 require 是 SYNC 并且以调用它的文件或函数的角度运行。因为您声明这是必需的,所以它会在其他任何事情之前立即执行。

前进的最佳实践是停止对 json 文件使用 require。需要缓存内容,因此如果 JSON 文件在生产中发生更改,您的用户可能会获得旧数据。而是使用fs.readfile(path, (err, data) => JSON.parse(data))

您可能想在您的情况下尝试一个 webpack 配置。

WebPACK DOCS:不检查需要依赖项

WEBPACK 文档:生成 Require Func

const requireJSON = typeof __webpack_require__ === "function" ? __non_webpack_require__ : require;
const assets = requireJSON(assetPath);
Run Code Online (Sandbox Code Playgroud)

这应该返回该需求的所有可能路径。