javascript - path.join 在 require 语句中

标签 javascript node.js webpack dynamic

我尝试使用 Path.joinrequire像这样的声明:

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)

但这会引发错误:
Error: Cannot find module '/home/dev/Website/lib/asset-manifest.json'

虽然文件在那里并且require如果我手动将字符串放入其中,则有效:
const assets = require('/home/dev/Website/lib/asset-manifest.json')

所以我想知道为什么不Path.joinrequire 工作?

此致

最佳答案

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();
您需要将 require 包围在函数内。否则 require 将在路径分配给assetPath 变量之前运行。这是因为 require 是 SYNC 并且从调用它的文件或函数的 Angular 运行。因为您说这是必需的,所以它会在其他任何事情之前立即执行。
前进的最佳实践是停止对 json 文件使用 require。需要缓存内容,因此如果生产环境中的 JSON 文件发生更改,您的用户可能会获得旧数据。而是使用 fs.readfile(path, (err, data) => JSON.parse(data))你可能想在你的情况下尝试一个 webpack 配置。
WEBPACK DOCS: Don't Check Require Dependencies
WEBPACK DOCS: Generate Require Func
const requireJSON = typeof __webpack_require__ === "function" ? __non_webpack_require__ : require;
const assets = requireJSON(assetPath);
这应该返回要求的所有可能路径。

关于javascript - path.join 在 require 语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53978334/

相关文章:

javascript - 仅在初始渲染后才 react CSS 动画

javascript - rails : Anchor Tag to jump to location on same page without sending a new request and having to re-render the page

javascript - 如何 "hide"ommit Babel/Webpack/Plugins配置文件?

javascript - Dotenv 没有将值作为字符串获取

webpack - babel-loader cacheDirectory 未知选项

javascript - 谷歌地图像在maps.google.com中一样拖动

javascript - Javascript帮助-随机Wav/mp3的音频播放波形

javascript - 如何解析来自 mysql 跟踪数据库的数据?

javascript - 在 Socket.IO 中的 ('connection' 上)一直被触发。怎么修?

javascript - 在 es2017 中,从异步方法访问时 'this' 未定义