7

我的 webpack2 配置中有一个下划线模板加载器,它是用 babel 转译的。它在编译时失败,因为with在代码编译代码中使用。这是我的装载机中的相关部分webpack.config.js

我在加载器下有这个部分:

{
    test: /\.html$/,
    use: [
        {
            loader: 'babel-loader',
            query: {
                presets: [
                    ['es2015', { modules: false }],
                    'es2016',
                    'es2017',
                    'stage-3',
                ],
            },
        },
        {
            loader: 'ejs-loader',
        },
    ],
};

这就是我想要的,我得到:

ERROR in ./src/table/row.html
Module build failed: SyntaxError: 'with' in strict mode (5:0)

  3 | var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
  4 | function print() { __p += __j.call(arguments, '') }
> 5 | with (obj) {
    | ^
  6 | 
  7 |  _.each(tableKeys, (k) => { ;
  8 | __p += '\n  <td>' +

如果我完全删除该babel部分,它可以工作,但没有转译 ES6 代码:

{
    test: /\.html$/,
    use: [
        {
            loader: 'ejs-loader',
        },
    ],
};

我也看到了这个关于删除严格模式的问题,并尝试了一些与 es2015 应用严格相关的事情。我想我已经尝试了该问题中的所有解决方案,包括热补丁解决方法,但我仍然遇到同样的错误。最后我尝试了这个:

{
    test: /\.html$/,
    use: [
        {
            loader: 'babel-loader',
            query: {
                presets: [
                ],
            },
        },
        {
            loader: 'ejs-loader',
        },
    ],
};

我虽然这应该与没有 bable pass 的情况相同,但我在这里得到了同样的错误。不知何故,没有任何预设我得到了同样的错误。

编辑

我也尝试通过传入来解决它variablequery并且我已经使用ejs-loader.

我制作了一个说明问题的存储库。主分支已将 babel-loader 注释掉并且可以使用,withtranspile即使{ modules: false }通过了分支也会有编译错误,并且我有一个名为的分支transpile-no-presets,其中 package.json 中的所有预设都被删除并且错误仍然显示。

4

2 回答 2

2

默认情况下,Underscore使用语句.template将您的数据放在范围内。with请参阅下划线文档

我认为最干净的解决方案是指示您ejs-loader不要编译为with语句,而是使用临时变量

{
    loader: 'ejs-loader?variable=data',
},

...并更改您的模板以引用临时变量。

从:

<ul>
  <% _.each(test, (n) => { %>
    <li>This is line number <%- n %></li>
  <% }); %>
</ul>

至:

<ul>
  <% _.each(data.test, (n) => { %>
    <li>This is line number <%- n %></li>
  <% }); %>
</ul>
于 2017-05-29T15:05:15.083 回答
0

改用 1.0 版underscore-template-loader

于 2019-03-17T11:00:07.243 回答