2012-02-16 2 views
6

Мне сложно кратко и ясно изложить свой вопрос, поэтому позвольте мне описать, с чем я работаю.Лучшие рекомендации Javascript для веб-приложений

Я строю веб-приложение, которое:

  • имеет собственный API, размещенных на субдомен (https://api.example.com)
  • имеет основное приложение, размещенное на TLD (https://www.example.com)
  • ДВУ не имеет какого-либо доступ к базе данных, но вместо этого взаимодействует с API для работы с данными
  • tld аутентифицируется с помощью api через OAuth и сохраняет токен доступа и доступ к маркеру доступа в сеансе
    • , когда сеанс заканчивается, маркер доступа больше не используется, таким образом, сеанс пользователя из

У меня есть маршрут в TLD (назовем его /ajax на этот вопрос), что яваскрипта вызовов (GET, PUT, POST, OR DELETE), чтобы отправлять запросы на api. Таким образом, никто никогда не должен видеть токен доступа, секрет ключа доступа, потребительский ключ или секрет потребителя.

То, как я вижу это, токен доступа и токен доступа - это единственные вещи, которые мне нужно хранить в сеансе, так как я могу захватить все остальное с помощью API, но вместо того, чтобы делать вызов каждый раз для каждого часть данных, в которой я нуждаюсь, я думаю, что некоторые вещи должны сохраняться, как аспекты профиля пользователя, предпочтения макета и т. д.

Каков наилучший способ для этого? Местное хранилище? Печенье? Должен ли я отказаться от этого и просто сохранить его в сеансах?

И если у вас есть время, какие другие лучшие практики существуют для создания таких сайтов, которые я, возможно, не знаю?

ответ

1

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

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

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

  1. Это делает предположение о том, что у вас есть в api объекте, определенный, заботящийся вызовов API, и вызывает функцию обратного вызова по завершению.
  2. , что данные, возвращаемые API, являются JSON, которые просто могут быть назначены переменной JavaScript,
  3. То, что возвращенный JSON представляет собой список объектов, каждый из которых имеет поле «id».
  4. Что у вас есть какой-то объект события, я обычно создаю свои собственные события, которые в основном несут объекты function в качестве слушателей, а когда они запускаются через прослушиватели и вызывают функции с полезной нагрузкой или без нее в зависимости от ситуации. Пример контейнера

данных:

MYAPP.data.BaseContainer = function (api_url, loadedEvent) { 
    var self = { 

     // Array to store the data returned via the APIs 
     _data : [], 

     // The API URL used to fetch data 
     api_url : api_url, 

     // Boolean flag to signify whether the _data variable has been populated 
     is_loaded : false, 

     // The even to fire once _data has been populated 
     loadedEvent : loadedEvent, 

     /** 
     * Returns the state of the is_loaded variable 
     */ 
     loaded : function() { 
      return self.is_loaded; 
     }, 

     /** 
     * Takes an ID and returns any member of the _data array 
     * that has that ID. 
     * 
     * @param id : an String or integer representing the ID. 
     * @returns {Object} 
     */ 
     byId : function (id) { 
      var toReturn = null; 
      for (var i = 0, len = self._data.length; i < len; i++) { 
       if (self._data[i].id == id) { 
        toReturn = self._data[i]; 
        break; 
       } 
      } 

      return toReturn; 
     }, 

     /** 
     * Returns the entire _data array. 
     */ 
     all : function() { 
      return self._data; 
     }, 

     /** 
     * This simple callback just stores the json response in 
     * its entirety on the _data variable. 
     */ 
     callback : function(data) { 
      self._data = data; 
      self.is_loaded = true; 
      loadedEvent.fire(self._data); 
     }, 

     /** 
     * Calls the API, if no callback has been specified as a parameter 
     * self.callback is used. 
     */ 
     getFromAPI : function(callback) { 
      if (typeof callback === 'undefined') { 
       callback = self.callback; 
      } 

      api.get(self.api_url, callback); 
     } 
    }; 

    self.getFromAPI(); 

    return self; 
}; 

С этим планом теперь я могу создать специальные контейнеры данных, как это:

/** 
* Stores a list of "friends" gotten from the API. 
* This is basically an instance of the BaseContainer object defined above. 
*/ 
MYAPP.data.Friends = (function() { 
    var self = MYAPP.data.BaseContainer("API_URL_TO_FECTH_FRIENDS_LIST", FriendsLoadedEvent); 

    return { 
     byId : self.byId, 
     all : self.all, 
     loaded : self.loaded 
    }; 
}()); 

Как только этот код выполняется, вызов API сделан , и FriendsLoadedEvent будет запущен, когда это будет сделано. Поэтому, если честно, я обычно использую JavaScript для хранения моих вещей. Но если вы хотите бросить LocalStorage в микс, это тоже легко!

Просто добавьте локальный код хранилища в объект BaseContainer, который сначала определяет, действительно ли клиент поддерживает localstorage, и если это зеркало поля _data в локальном хранилище. Это удобно для быстрого доступа к часто используемым данным между сеансами. Используйте доступные JSON-инструменты для преобразования данных из JSON в «Text» и обратно в LocalStorage.

Просто имейте в виду, что вы не можете полагаться на LocalStorage как на свою основную структуру данных, у вас нет гарантии, что клиент поддерживает ее, и даже когда она выполняет верхнюю границу для того, сколько данных вы фактически можете хранить, отличается от браузеры. Поэтому использовать его для хранения данных, которые:

  • Вы хотите получить доступ к очень часто,
  • , что вы чувствуете, просто должны быть там, сразу же, как только пользователь войдет в,
  • и не меняется часто достаточно, чтобы постоянно обновлять API-вызовы.
0

Поздравляем! Вы уже ответили на большинство вопросов. Если вы хотите сохранить пользовательские данные, вам нужно использовать что-то вроде локального хранилища или файлов cookie. В вашем случае лучше всего использовать локальное хранилище. С помощью файлов cookie каждый запрос страницы отправляется в файлы cookie вместе с заголовком.

Best of Luck with your app.

+0

Почему голос? –

+0

Я не проголосовал за вас - у меня даже нет этой функции, разблокированной. Если бы я должен был догадаться, кто-то неправильно истолковал ваш ответ как сарказм. – Steve

Смежные вопросы