因此,我使用包esm和module-alias,但似乎esm不注册模块别名的路径。
下面是加载服务器文件的方式:
nodemon -r esm ./src/index.js 8081下面是我的index.js文件的顶部:
import "module-alias/register"
import "@/setup"import "@/setup"不工作,而require("@/setup")工作。
发布于 2018-11-15 11:02:04
问题是,在加载任何其他模块之前,esm在解析文件时尝试处理所有import语句。
在处理import语句时,它使用节点的内置require,而不是module-alias创建的修改后的require
要解决这个问题,您需要先加载module-alias,然后加载esm。这样,module-alias将有机会在esm做任何事情之前修改require函数。
您可以通过向节点传递多个-r参数来实现这一点,但请确保module-alias放在第一位:
node -r module-alias/register -r esm index.js 8081或使用nodemon
nodemon -r module-alias/register -r esm ./src/index.js 8081您还需要从代码中删除import "module-alias/register",因为现在它是从命令行加载的。
发布于 2020-07-05 14:55:14
对于我来说,使用了以下代码:
package.json
"scripts": {
"dev": "pkill -f lib/serverIndex.js; NODE_ENV=development node lib/serverIndex.js",lib/serverIndex.js
require = require('esm')(module/*, options*/);
require('module-alias/register');
module.exports = require("./server.js");发布于 2022-05-10 01:53:53
多年来,这个问题一直困扰着我,因为我想要编写在节点和浏览器之间共享的高质量代码。我终于找到了一个行之有效的系统:
'nesm.js'
/*
* esm and module-alias do not play nicely together.
* this precise arrangement is the only way I found to make it work.
* you can run this from anywhere in your project hierarchy.
* you can use args, and use in npm scripts.
* encourage the node.js devs to make this work natively. ux matters.
* ---- CAVEATS
* will not work with "type":"module"
* ---- SETUP
* place 'nesm.js' in the root of your project
* [optional] place the 'nesm' shell script in your path, make it executable
* ---- USAGE
* > nesm file_to_run.js
* to run without the nesm shell script:
* > node path/to/nesm.js -- file_to_run.js
* to run with nodemon:
* > nodemon -- path/to/nesm.js -- file_to_run.js
*/
require = require('esm')(module); // eslint-disable-line no-global-assign
require('module-alias/register'); // must come after esm for some reason
let runNext;
for(const arg of process.argv) {
if(runNext) {
let filename = arg;
if(filename[0]!='.' && filename[0]!='/') filename = './'+filename;
require(filename);
break;
}
runNext = (arg=='--');
}'nesm‘shell脚本
#!/bin/bash
if [ -z $1 ]; then
echo "Node esm runner. Usage: nesm file_to_run.js"
exit 1
fi
baseDir=$( pwd )
while [ ! -f "$baseDir/nesm.js" ]; do
if [ ${#baseDir} -le 1 ]; then
echo "nesm.js not found in folder ancestry"
exit 1
fi
baseDir="$(dirname "$baseDir")"
done
file1=$(realpath $1);
node $baseDir/nesm.js -- $file1https://stackoverflow.com/questions/53200528
复制相似问题