Включить файл JavaScript в другой файл с Node.js
Не превращая его в модуль, можно также включить один файл в другой благодаря функциям Node.
В командной строке интерпретатор JavaScript сам по себе не может включать файл в интерпретируемый им файл, так как он предназначен для обработки файлов, уже загруженных в память, браузером. Но с помощью модуля vm node для загрузки файла мы подставляем браузер. Vm - базовый модуль, который не нужно устанавливать.
В качестве примера мы хотим загрузить файл extfile.js, который имеет следующее содержимое:
// JavaScript Document
var extvar = "hello externe"
function extfun(a, b) {
var c = a * b
return c
}
В основной файл импортируем модули fs и vm и добавляем функцию загрузки:
// JavaScript Document
var fs = require("fs")
var vm = require('vm')
var content = fs.readFileSync(filename)
vm.runInThisContext(content)
Можно свести загрузку к одной инструкции:
vm.runInThisContext(fs.readFileSync(__dirname + "/extfile.js"))
Какая инструкция эквивалентна функции включения PHP или директиве # include от C .
Затем в первом файле JavaScript можно напрямую использовать переменные и функции, которые содержит включенный файл или файлы:
console.log(extvar)
console.log(extfun(10, 50))
Что показывает «hello external», а затем «500».
Код демо указан в архиве для скачивания.
Этот метод имеет два недостатка:
- Файл не имеет доступа к переменным, объявленным в основном файле.
- Невозможно использовать требуемую функцию в файле inclusive, поскольку vm обращается к V8 и, следовательно, игнорирует функции Node.
- Так что мы не можем использовать стандартную библиотеку в файле включения.
Для получения доступа к глобальному контексту, включая объекты, назначенные по требованию, вместо этого будет использоваться функция eval:
eval(fs.readFileSync(__dirname + '/extfile.js')+'');
Который снимает все предыдущие ограничения. Необходимо добавить пустую строку в конец кода, загруженного readFileSyнк.
Использовать браузер
Предыдущий метод необходим для взаимодействия с программой командной строки (с помощью fs.readSync для ввода данных).
Просто показывая результаты программы, можно обойтись и без модуля загрузки, используя браузер и генерируя результаты на веб-странице. Код основного файла будет выглядеть следующим образом:
<script src="extfile.js"></script>
<script>
document.write(extvar)
document.write("<br>")
document.write(extfun(10, 50))
document.write("<br>")
</script>
Файл, который необходимо включить, не меняется, если он не содержит инструкций по отображению .
Этот второй метод может быть более эффективным, чем использование модуля vm или eval, но требует замены console.log на document.write.
Файл для частого включения
В конце концов, когда модуль для включения предназначен для частого повторного использования, преобразование его в модуль является оптимальным решением. Атрибуты и методы становятся экспортируемыми :
exports.extvar = "hello externe"
exports.ext = functionf(a, b) {
var c = a * b
return c
}
Для использования его содержимого необходимо добавить имя модуля в виде префикса:
var extfile = require("extfile.js")
console.log(extfile.extvar)
console.log(extfile.extfun(10, 50))
В заключение можно выделить четыре варианта включения внешнего реестра, каждый из которых лучше подходит для каждой конкретной ситуации.
Файл demovm.js - первый пример с результатами в командном окне и demohtml.html - второй с результатами в HTML-файле.