首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >esm不解析模块别名。

esm不解析模块别名。
EN

Stack Overflow用户
提问于 2018-11-08 02:02:26
回答 4查看 6.7K关注 0票数 12

因此,我使用包esmmodule-alias,但似乎esm不注册模块别名的路径。

下面是加载服务器文件的方式:

代码语言:javascript
复制
nodemon -r esm ./src/index.js 8081

下面是我的index.js文件的顶部:

代码语言:javascript
复制
import "module-alias/register"
import "@/setup"

import "@/setup"不工作,而require("@/setup")工作。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-11-15 11:02:04

问题是,在加载任何其他模块之前,esm在解析文件时尝试处理所有import语句。

在处理import语句时,它使用节点的内置require,而不是module-alias创建的修改后的require

要解决这个问题,您需要先加载module-alias,然后加载esm。这样,module-alias将有机会在esm做任何事情之前修改require函数。

您可以通过向节点传递多个-r参数来实现这一点,但请确保module-alias放在第一位:

代码语言:javascript
复制
node -r module-alias/register -r esm index.js 8081

或使用nodemon

代码语言:javascript
复制
nodemon -r module-alias/register -r esm ./src/index.js 8081

您还需要从代码中删除import "module-alias/register",因为现在它是从命令行加载的。

票数 12
EN

Stack Overflow用户

发布于 2020-07-05 14:55:14

对于我来说,使用了以下代码:

package.json

代码语言:javascript
复制
  "scripts": {
    "dev": "pkill -f lib/serverIndex.js; NODE_ENV=development node lib/serverIndex.js",

lib/serverIndex.js

代码语言:javascript
复制
require = require('esm')(module/*, options*/);
require('module-alias/register');
module.exports = require("./server.js");
票数 0
EN

Stack Overflow用户

发布于 2022-05-10 01:53:53

多年来,这个问题一直困扰着我,因为我想要编写在节点和浏览器之间共享的高质量代码。我终于找到了一个行之有效的系统:

  • 将“nesm.js”放在项目的根目录中
  • 可选地将'nesm‘shell脚本放置在路径中,使其可执行
  • 运行脚本:'nesm file_to_run.js‘或’节点路径/to/nesm.js- file_to_run.js

'nesm.js'

代码语言:javascript
复制
/*
 * 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脚本

代码语言:javascript
复制
#!/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 -- $file1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53200528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档