Как заставить работать webpack2 и загрузчик шаблонов подчеркивания + babel без получения сообщения "Ошибка сборки модуля: SyntaxError: 'with' в строгом режиме (5:0)"

У меня есть загрузчик шаблонов подчеркивания в моем конфиге 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, но здесь я получаю ту же ошибку. Как-то без всяких пресетов я получаю такую ​​же ошибку.

РЕДАКТИРОВАТЬ

Я также попытался обойти это мимоходом variable в query и я сделал эту работу с ejs-loaderОднако я не ищу решение, в котором все шаблоны нужно менять.

Я сделал хранилище, которое иллюстрирует проблему. Мастер ветка прокомментировала babel-loader и работает с with в то время как transpile ветка будет иметь ошибки компиляции, хотя { modules: false } прошло, и у меня есть ветка под названием transpile-no-presets где все пресеты в package.json удалены и ошибка все еще отображается.

1 ответ

По умолчанию подчеркивание .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>

Используйте версию 1.0 из underscore-template-loader вместо.

Другие вопросы по тегам