Less.js ленивая загрузка листа

Мне интересно, есть ли способ загрузить один less лист после загрузки страницы. В этом вопросе есть ответ, в котором объясняется, как перезагрузить все листы, но для моих существующих прецедентов листы никогда не имеют зависимостей от недавно загруженных листов, и было бы хорошо просто добавьте лист лениво. Я думаю что-то вроде

less.sheets.push(mySheet);
less.loadStyleSheet(mySheet);

может представлять собой возможный API? Cheers,

Колин

ОБНОВЛЕНИЕ 3 Дек 2010:

Я опробовал исправление Livingston Samuel в файле less.js, и, хотя он работает, он не распознает определения в уже загруженных таблицах стилей. Вот мои примеры файлов

а. index.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Simple</title>

  <link rel="stylesheet/less" href="/static/less/style.less" id="abc123"/>
  <script src="/static/js/less-1.0.40.js"></script> 
</head>
<body>
  <div id="container">
    <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
  </div>
  <div id="abc"><div>Bingo</div></div>
</body>

<script>
console.log("loading new sheet");
less.loadStyleSheet("/static/less/style2.less", function() {
    console.log("Loaded!"); 
});

console.log("called");

</script>
</html>

б. style.less

@primary_color: green;

.rounded(@radius: 5px) {  
  -moz-border-radius: @radius;  
  -webkit-border-radius: @radius;  
  border-radius: @radius;  
}

#container {
  background: @primary_color;
  .rounded(5px);

  div {
    color: red;
  }
}

с. style2.less

#abc {
  background: @primary_color;
  .rounded(10px);

  div {
    margin: 2px;
    color: blue;
  }
}

Таким образом, вторая таблица стилей загружается лениво, но она имеет следующую ошибку синтаксического анализа в style2.less

". rounded undefined"

.rounded определяется style.less, и поскольку я не выгружал этот лист, я думал, что он должен быть доступен компилятору в текущей среде.

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

Колин

Ответ 1

Я не смог понять это с объяснениями выше, поэтому я предоставил свои собственные.

Итак, сначала. Загрузите свою таблицу стилей Less после загрузки страницы. Что-то вроде этого:

$('head').append('<link rel="stylesheet/less" href="path/to/yourDynamicStyles.less" />');

Великий. Теперь выберите свою таблицу стилей и вставьте ее в коллекцию листов, которые у Less.js уже есть. Он ожидает объект DOM, поэтому я использовал селектор jQuery.

less.sheets.push($('link[href="path/to/yourDynamicStyles.less"]')[0]);

Если кто-то знает лучший способ сделать это, пожалуйста, просветите меня. (Я должен был добавить [0], чтобы получить его на правильном.) Если вы сделаете это в консоли, он вернет номер. Это число, сколько листов меньше знает о том, что, надеюсь, он вернул номер один выше, чем то, что у вас уже было при загрузке страницы.

Следующая часть проста. Вы говорите Less.js, чтобы перезагрузить все его мелкие листы хорошего качества, это включает лист, который вы только что добавили в его стек.

less.refresh();

И ты туда. Это должно было просто динамически загрузить таблицу стилей и сказать "Меньше" для ее компиляции. Надеюсь, это поможет.

Ответ 2

less.js имеет функцию loadStyleSheet в ней локальную область, которая может использоваться для динамической загрузки и анализа меньших стилей (ленивая загрузка).

Единственная проблема заключается в том, что функция находится в замыкании, созданном для определения less.js, поэтому вы не можете получить доступ к функции из вашего кода.

Может быть, это может быть показано путем расширения api.


Update:

Я создал разветвленную версию less.js @https://github.com/livingston/less.js

Используя эту версию, вы можете загрузить любую таблицу стилей с помощью метода less.less.loadStyleSheet(YOUR_FILE_URL, CALLBACK)

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

Ответ 3

Только что принял ответ MatthewForr для моих собственных нужд:

$.each(['/css/style1.less', '/css/style2.less'], function (index, fileName) {
    var $sheet = $('<link />', {
        href: fileName,
        rel: 'stylesheet/less',
        type: 'text/css'
    }).appendTo('head');
    less.sheets.push($sheet[0]);
});
less.refresh();

Ответ 4

В качестве альтернативы вы можете написать код на стороне сервера, который бы превратил вашу таблицу без лишних слов в .css на лету. От клиента вы загрузите его лениво, как если бы это была любая другая таблица стилей .css. Это подход, используемый http://www.dotlesscss.org/, хотя он может использоваться любым ароматом .less.

Возможно, не то, что вы ищете, но это вариант для некоторых, которые я думаю.

Ответ 5

Вы можете использовать эту легкую библиотеку для lazy load less/css и js files (отказ от ответственности: я автор).

Это так же просто, как:

lazy.load('/static/less/style.less');

Он также может получать обратный вызов, загружать еще несколько активов с зависимостями и заботиться о кеше.

Ответ 6

Все, что вам нужно сделать, это добавить новый тег script в DOM. Затем он будет загружен и выполнен.

function addScript (id, url)    //  Adds scripts to the DOM
{
    var s = document.createElement('script');
    s.id = id;
    if (url)    s.src=url;
    s.type='text/javascript';

    document.getElementsByTagName('head')[0].appendChild(s)
    return s;
}

Это то, что я использую на своем сайте, но я называю его синтаксическим разбором. Чтобы вы использовали его как ленивый загрузчик, он должен работать нормально, чтобы вы могли называть его onload или аналогичным образом.