Функция Javascript .toString() в webpack

#javascript #webpack

#javascript #webpack

Вопрос:

В моем случае разработки webpack мне нужно выводить функцию в виде строк с помощью function.toString() . Но webpack может переводить некоторые операторы в стили модулей.

 const myFunc = function{
  this.methods.log(Date.now())
}

myFunc.toString()
 
 "myFunc(){this.methods.log(_Users_xxx_Desktop_designer_web_node_modules_babel_runtime_corejs2_core_js_date_now__WEBPACK_IMPORTED_MODULE_3___default()());}"

 

Что мне нужно:

 "myFunc(){this.methods.log(Date.now())}"
 

Я обработал this указатель на правильный объект. Я просто хочу, чтобы webkit игнорировал эту функцию.

Ответ №1:

В этом конкретном случае преобразование сначала выполняется babel, поскольку вы используете transform-runtime плагин, он решает, Date откуда должен исходить API core-js . Webpack запускается позже, потому Date что теперь он видит ссылку на импортированную библиотеку, поэтому он преобразует оператор import в WEBPACK_IMPORT_MODULE .

Вы либо настраиваете babel, чтобы запретить его преобразование Date , либо можете сделать наоборот. Вы пишете строку функции, затем оцениваете ее, чтобы получить реальную функцию.

 const myFuncStr = `function (){
  this.methods.log(Date.now())
}`

const myFunc = eval(myFuncStr)
 

Комментарии:

1. Содержимое строковой функции открыто для пользователей, поэтому я не могу знать, какие объекты будут использоваться. И я хочу работать с TypeScript и редактором высокого уровня, использовать string и eval, для меня это не очень хорошая практика. Есть ли какие-то команды комментариев или другие вещи, которые нужно сообщить Babel skip this function ?

2. @лейли АФАИК, такого спасения нет

3. Одна вещь, о которой я могу думать, это использовать babel polyfill вместо transform runtime. Кроме того, я не думаю, что это плохая практика. За все приходится платить. Просто делайте то, что решает проблему.