В следующих вопросах и ответах показано, как загрузить один файл javascript
в JavaScriptCore
: { ссылка }
func analyzeText(scriptName: String) {
var ext = scriptName.pathExtension
var fileName = scriptName.substringToIndex(
advance(scriptName.startIndex,
scriptName.utf16Count - ext.utf16Count - 1))
if fileExtension.utf16Count == 0 {
fileName = scriptName
ext = "js"
}
let url = NSBundle.mainBundle()
.URLForResource(fileName, withExtension: ext)
let scriptCode = String(contentsOfURL: url!,
encoding: NSUTF8StringEncoding,
error: nil)!
var context = JSContext(virtualMachine: JSVirtualMachine())
context.evaluateScript(scriptCode)
/* ... */
}
Что делать, если файлов javascript много и они имеют взаимозависимости: могут ли они загружаться последовательно в порядке, обратном их зависимостям, и ожидать правильного разрешения?
utils.js
file1NeedingUtils.js
file2NeedingFile1.js
Итак:
func analyzeText(jsContext: JSContext, scriptName: String) {
var ext = scriptName.pathExtension
var fileName = scriptName.substringToIndex(
advance(scriptName.startIndex,
scriptName.utf16Count - ext.utf16Count - 1))
if fileExtension.utf16Count == 0 {
fileName = scriptName
ext = "js"
}
let url = NSBundle.mainBundle()
.URLForResource(fileName, withExtension: ext)
let scriptCode = String(contentsOfURL: url!,
encoding: NSUTF8StringEncoding,
error: nil)!
jsContext.evaluateScript(scriptCode)
}
var jsCtx = JSContext(virtualMachine: JSVirtualMachine())
["utils.js","file1NeedingUtils.js","file2NeedingFile1.js"]
.forEach( x in analyzeScript(jsCtx, x))
Обратите внимание, что мы используем один и тот же JSContext для всех вызовов.
Эта функциональность обычно домен обрабатываемого браузера. Я планирую go по этому маршруту, но мне интересно, могут ли быть проблемы. Кроме того, есть ли полезные оптимизации процесса?