#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. Кроме того, я не думаю, что это плохая практика. За все приходится платить. Просто делайте то, что решает проблему.