Javascript 不带';断裂压痕

Javascript 不带';断裂压痕,javascript,ecmascript-6,template-literals,Javascript,Ecmascript 6,Template Literals,根据,在ECMAScript 6中可以定义多行字符串,而不必将字符串的后续行放在行的最开头 包含一个代码示例: var a = dontIndent `This is a template string. Even though each line is indented to keep the code neat and tidy, the white space used to indent is not in the r

根据,在ECMAScript 6中可以定义多行字符串,而不必将字符串的后续行放在行的最开头

包含一个代码示例:

var a = dontIndent
        `This is a template string.
         Even though each line is indented to keep the
         code neat and tidy, the white space used to indent
         is not in the resulting string`;

有人能解释一下如何做到这一点吗?如何定义此
dontIndent
以删除用于缩进的空白?

此功能通过定义自定义函数并将其用作标记来实现(
dontIndent
)。代码来自:

函数dedent(调用站点,…参数){
函数格式(str){
设大小=-1;
返回str.replace(/\n(\s+)/g,(m,m1)=>{
如果(尺寸<0)
尺寸=m1。替换(/\t/g,“”)。长度;
返回“\n”+m1.slice(数学最小值(m1.length,size));
});
}
如果(调用站点的类型==“字符串”)
返回格式(callSite);
if(调用站点的类型==“函数”)
return(…args)=>格式(callSite(…args));
让输出=调用站点
.slice(0,args.length+1)
.map((文本,i)=>(i==0?“:args[i-1])+文本)
.加入(“”);
返回格式(输出);
}
我每晚都在Firefox中成功地测试了它:


2020答案:尽管如此,JS stdlib中仍然没有内置任何东西来处理长线路的去齿处理。您目前有两种选择:

  • 和包将处理此问题。请注意,
    dedent js
    程序包实际上可用于制表符和空格,
    dedent
    是一个单独的程序包,在制表符上失败:
  • var-dedent=require('dedent-js');
    
    var text=dedent(`
    好啊
    `);
    
    将去掉每行和前导回车符上的空白。它还有更多的用户,一个问题跟踪器,并且比从堆栈溢出复制粘贴更容易更新

  • 不要缩进长行,但使用编辑器将长行显示为缩进的。例如,vsCode—您可以简单地使用长行,而不缩进任何内容,并在长字符串中包含回车符。vsCode将显示缩进。下面的字符串没有缩进-第二行
    空导出…
    紧跟在回车之后,但显示为缩进

  • 您也可以对双空格进行字符串替换(假设缩进使用空格,而不是制表符)。显然,实际字符串中的任何双空格都将被删除,但在大多数情况下,这应该是可以的

    const MSG = (`Line 1
              line 2
              line 3`).replace(/  +/g, '');
    // outputs
    /*
    Line 1
    line 2
    line 3
    */
    
    作为状态,函数可以用作标记,只需将其放在模板字符串前面即可调用

    有许多NPM模块可以做到这一点,它们将覆盖许多您自己很难覆盖的边缘案例。主要有两项:

    ,每周下载400万次,最近一次更新是在4年前

    ,每周下载2500次,4个月前更新

    如何定义此
    dontIndent
    内容以删除用于缩进的空白

    我想这样的事情对于很多情况(包括OP)都应该足够了:

    函数dontIndent(str){
    返回(“”+str)。替换(/(\n)\s+/g,$1');
    }
    
    此代码段中的演示代码:

    var a=dontIndent
    `这是一个模板字符串。
    即使每行都缩进以保持
    代码整洁,空格用于缩进
    不在结果字符串“”中;
    控制台日志(a);
    函数dontIndent(str){
    返回(“”+str)。替换(/(\n)\s+/g,$1');
    
    }
    所有现有答案的问题是,它们都是运行时解决方案。也就是说,它们采用多行模板文本并在程序执行时通过函数运行它,以消除前导空格。这是一种“错误的方法”,因为这个操作应该在编译时完成。原因是,这个操作中没有任何东西需要运行时信息,所有需要的信息在编译时都是已知的

    为了在编译时执行此操作,我编写了一个。基本上它的工作原理如下:

    consthttprfc=`超文本传输协议——HTTP/1.1
    本备忘录的状况
    本文件规定了互联网标准跟踪协议
    互联网社区,并要求讨论和建议
    改进。请参考当前版本的“互联网”
    标准化州的官方协议标准”(STD 1)
    以及本议定书的现状。本备忘录的分发不受限制。
    版权公告
    版权所有(C)互联网协会(1999年)。保留所有权利;
    console.log(httpRFC);
    
    将打印:

    超文本传输协议--HTTP/1.1 本备忘录的状况 本文件规定了互联网标准跟踪协议 互联网社区,并要求讨论和建议 改进。请参考当前版本的“互联网” 标准化州的官方协议标准”(STD 1) 以及本议定书的现状。本备忘录的分发不受限制。 版权公告 版权所有(C)互联网协会(1999年)。版权所有。 插值工作也没有任何问题。另外,如果您在模板文本的开头反勾号后的第一列之前开始一行,插件将抛出一个错误,显示错误的位置。如果以下文件位于项目下的
    src/httpRFC.js

    consthttprfc=`超文本传输协议——HTTP/1.1
    本备忘录的状况
    本文件规定了互联网标准跟踪协议
    互联网通讯
    
    const MSG = (`Line 1
              line 2
              line 3`).replace(/  +/g, '');
    // outputs
    /*
    Line 1
    line 2
    line 3
    */