SnakeskinTpl/Snakeskin

ss brokes some minified js code

Closed this issue · 11 comments

Have some problems that ss brokes some minified js code
jquerymin for example

input

#{ template core() }
L="[\\x20\\t\\r\\n\\f]"
#{/}

output

L="[\x20\t\r\n\f]"

Maybe I need some filter or renderMode?
was trying raw
But got another error :))

ReferenceError: document is not defined

Got another

< style
    += jqueryui.styles()

Лол, чувак, что ты пытаешься сделать?

cdata should help

#{ template core() }
#{cdata}
L="[\\x20\\t\\r\\n\\f]"
#{/cdata}
#{/}

But why not just attach JS and CSS as an external file?

- script js file = foo.js
- link css href = foo.css

Лол, чувак, что ты пытаешься сделать?
Блин. Прям автоматика какая-то - на гите на англ создавать ищью и обсуждать :)

Я делаю конструктор.
На вход он принимает набор конфигов и отдает структуру файлов и папок.
Есть несколько модов, которые отличаются тем, что тот же набор конфигов на выходе по разному группируются по папкам и файлам.

Тот же jquery.min может быть как отдельным файлом, так и в составе какого-то файла.
Поэтому такое не подходит But why not just attach JS and CSS as an external file?
Поэтому я для него сделал отдельный шаблон.

#{ template core() } - расширенный режим чуток помог, что мне не нужно следить за отступами, как в jade-like, но как оказалось он режет символы.

#{cdata} - на простом примере L="[\\x20\\t\\r\\n\\f]" работает как надо. Да. Но на реальном большом файле https://code.jquery.com/jquery-1.12.2.min.js скрипт падает

SyntaxError: Octal literals are not allowed in strict mode.
   at exports.runInThisContext (vm.js:53:16)
   at Module._compile (module.js:414:25)
   at Object.Module._extensions..js (module.js:442:10)
   at Module.load (module.js:356:32)
   at Function.Module._load (module.js:311:12)
   at Module.require (module.js:366:17)
   at require (module.js:385:17)
   at Object.exports.compileFile (.\dev\node_modules\snakeskin\snakeskin.js:181:10)

По сути мне нужно такой темплеит, который вот как введено - так и отдает. Я могу что угодно написать. Ему неважно. Для темплеита это будет raw текст, который просто надо отдать as is и пока с этим проблемы :(

Вообще, у SS есть слак. Можно писать там, это быстрее будет, наверное)
https://snakeskin.slack.com/

Во-вторых... Ты уверен, что тебе вебпак не подойдёт больше?

В-третьих, когда мне нужно было инлайнить файлы прямо текстом в шаблон (инлайнил метрику и аналитику) -- как я понимаю, это примерно то, что тебе нужно, я написал для этих целей фильтр, могу подарить его код)

snakeskin.importFilters({
    insertFileContent: (() => {
        const data = {};
        return (filepath) => {
            filepath = path.resolve(filepath);
            if (data[filepath] && process.env.NODE_ENV === 'production') {
                return data[filepath];
            }

            let content = '';

            try {
                content = fs.readFileSync(filepath);
            } catch (err) {
                log.error('File read failed', err);
            }

            data[path] = content;
            return content;
        };
    })()
});

Ну, правда, тебе его там подгонять придётся, наверное, но вряд ли сильно.

Создал в слаке канал consulting, можно писать туда)
https://snakeskin.slack.com/messages/consulting/

Я просто не понимаю, зачем вообще может пригодится создавать шаблон в который текстом вставлять минифицированный жиквери и отдавать его текстом :)

Но вообще для таких задач, используется cdata, он как раз полностью игнорируется парсером и вставляется как есть, т.е. внутри cdata мы уже не можем использовать другие директивы SS.

#{cdata} - на простом примере L="[\x20\t\r\n\f]" работает как надо. Да. Но на реальном большом файле https://code.jquery.com/jquery-1.12.2.min.js скрипт падает

Внимание на ошибку: падает не SS, а JS парсер, который уже после выполняет файл, т.е. скорее всего проблема именно в самом коде жиквери, а не СС.

Вообще если очень нужно, чтобы шаблон таки отдавал RAW файл, то почему бы просто не грузить его с диска?

- import fs from 'fs'
- template foo()
  += fs.readFileSync('myFile.js')

Как вариант.

#{ template core() } - расширенный режим чуток помог, что мне не нужно следить за отступами, как в jade-like, но как оказалось он режет символы.

Он не режет символы, просто СС управляет текстом, а о природе этого текст он ничего не знает. Ты скормил ему кусок JS-а и хочешь чтобы СС знал что это JS и т.д. но для SS это простой plain text, где \\n парсится как \(экранирующий слеш)\(простой слеш)n(просто символ).

Создал в слаке канал consulting, можно писать туда)
не пускает туда. Можете меня туда пригласить? yazonnile@gmail.com

Исправлено. Спасибо @yazonnile