NodeAsp
— это набор классической среды ASP, основанной на модульной идее NodeJS, позволяющей вам с удовольствием писать программы ASP, используя новые концепции.
NodeAsp
использует требование, соответствующее спецификации CommonJS и полностью совместимое с методом загрузки модулей NodeJS, что позволяет напрямую использовать более 50% модулей NodeJS. Все модули, которые не имеют ничего общего с рабочей средой NodeJS и конкретными объектами ES5-ES6, можно использовать напрямую. Такая огромная библиотека ресурсов модулей в прошлом не была доступна ни в одной платформе ASP.
NodeAsp
— это уникальный и инновационный фреймворк в области ASP. Ее появление изменило традиционную модель написания ASP, позволяя выполнять фронтенд- и бэкенд-разработку одновременно, только зная js, и устраняя утомительный процесс развертывания. NodeJS-серверы.
NodeAsp
здесь является ограничителем поля ASP.
NodeAsp: http://nodeasp.com.
Загрузка модуля: http://nap.webkits.cn.
Эта платформа работает только на платформе WIN IIS. Обычно эту платформу может запускать обычный виртуальный хост ASP.
default.asp
<!-- #include file="NodeAsp.asp" -->
<%
require( ' ./index.js');
%>
index.js
var http = require ( 'http' ) ;
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . end ( 'Hello Worldn' ) ;
} ) ;
Шаг 1. Загрузите NodeAsp.
Шаг 2. Ссылка на NodeAsp.
<!--#include file="NodeAsp.min.asp" -->
Шаг 3. Используйте NodeAsp.
< %
var version = process.version;
Response.Write(version);
% >
Эти объекты доступны во всех модулях. Некоторые объекты на самом деле находятся не в глобальной области, а только в области модуля — эта ситуация специально указана в следующей документации.
В браузерах областью верхнего уровня является глобальная область. Это означает, что в браузере var Something объявит глобальную переменную, если она в данный момент находится в глобальной области видимости. В NodeAsp все по-другому. Область верхнего уровня не является глобальной областью, var что-то в модуле NodeAsp принадлежит только этому модулю.
Выведите некоторую информацию о рабочей среде.
В NodeAsp основная цель существования процесса — обеспечить совместимость с определенными модулями NodeJS, которые обычно не используются.
Используется для вывода стандартного вывода и стандартной ошибки.
Подробности смотрите в разделе控制台
ниже.
Мы представили модуль буфера, совместимый с Buffer NodeJS. Обратите внимание, что модуль буфера должен быть включен в node_modules, чтобы использовать Buffer.
Если вы забудете поместить модуль буфера в node_modules, это не повлияет на нормальную работу программы. Ошибка будет выдана только при использовании Buffer.
Импортировать модули. Немного отличается от NodeJS тем, что, поскольку IIS может напрямую выполнять только файлы ASP вместо файлов JS, require также можно использовать для запроса модуля в коде ASP. Аналогично выполнению узла test.js в командной строке.
Если вы хотите узнать реальный путь к файлу при вызове метода require() для загрузки модуля, вы можете использовать метод require.resolve() для его получения.
Подробности смотрите в разделе模块
ниже.
Путь к файлу текущего исполняемого кода. Это проанализированный абсолютный путь к файлу кода.
Например: выполните C:websitesnodeaspindex.asp.
// module.js
Response . Write ( __filename ) ;
// C:websitesnodeaspmodule.js
// index.asp
require ( './module' ) ;
Response . Write ( __filename ) ;
// C:websitesnodeaspindex.asp
Имя каталога, в котором в данный момент выполняется сценарий.
Ссылка на текущий модуль. В частности, Module.exports и Exports указывают на один и тот же объект. Модуль на самом деле не глобальный, а локальный для каждого модуля.
Подробности смотрите в разделе模块
ниже.
Ссылка на объект Module.exports, который используется всеми экземплярами текущего модуля и доступен через require(). Подробности о том, когда использовать экспорт, а когда модуль.exports, можно найти в документации по системе модулей. Экспорт на самом деле не глобальный, а локальный для каждого модуля.
Подробности смотрите в разделе模块
ниже.
Функция таймера включает в себя следующие четыре функции. Поскольку ASP является однопоточным, следующие функции фактически несовместимы.
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)
Чтобы лучше отлаживать программы ASP, мы реализовали инструмент отладки командной строки, аналогичный браузеру NodeJS/Chrome. Адрес загрузки: https://github.com/Spikef/NodeAsp-Console.
ПРИМЕЧАНИЕ. Для работы необходимы IIS7.5 и .NET4, другие среды не тестировались.
Откройте CMD с правами администратора и используйте команду REGASM для регистрации компонентаTerminal.dll, где REGASM находится по адресу C:WindowsMicrosoft.NETFrameworkv4.0.30319 (конкретное расположение связано с номером версии).
C:WindowsMicrosoft.NETFrameworkv4.0.30319REGASM D:componentTerminal.dll /codebase
Для 32-битных систем найдите следующий раздел реестра:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
Для 64-битных систем найдите следующий раздел реестра:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
Выберите или создайте новый элемент FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
, а затем создайте новое значение DWORD:
Имя: w3wp.exe Значение: 1
Дважды щелкните Console.exe, чтобы открыть командную строку отладки NodeAsp.
Введите следующий код в default.asp, а затем откройте default.asp через браузер. Далее вы можете увидеть результаты в Console.exe
.
var a = { name : "nodeasp" , value : true }
// 在console中将输出
//{
// name: "nodeasp",
// value: true
//}
Вывод на консоль с использованием цветов по умолчанию.
var a = { name : "NodeAsp" , version : "0.0.1" } ;
console . log ( a ) ;
Для вывода на Консоль используйте зеленый цвет.
Для вывода на консоль используйте красный цвет. В частности, если выходные данные представляют собой объект Error, будет отображено полное сообщение об ошибке.
Для вывода на Консоль используйте желтый цвет.
Используйте метку, чтобы указать имя и запустить таймер для расчета времени, необходимого для операции.
Выведите время, необходимое для выполнения операции.
Пример:
console . time ( '100-elements' ) ;
for ( var i = 0 ; i < 100 ; i ++ ) {
;
}
console . timeEnd ( '100-elements' ) ;
// prints 100-elements: 262ms
В консоли вы можете ввести следующие команды.
cls/clear: Очистить информацию об отладке, восстановить ее невозможно.
about: отображение информации.
copylast: копирует предыдущее выходное сообщение.
copyall: копировать всю выходную информацию.
NodeAsp имеет систему загрузки модулей, практически идентичную NodeJS, что гарантирует, что NodeAsp может напрямую использовать большое количество модулей NodeJS.
Ядро NodeAsp практически не содержит функций, необходимых для разработки веб-сайтов, и все функции расширяются с помощью модулей. Вы можете найти нужные вам функциональные модули через центр модулей NodeAsp или NPM.
В NodeAsp файлы и модули имеют взаимно однозначное соответствие. Ниже приведен пример загрузки файла Circle.js из foo.js в тот же каталог.
Содержимое foo.js
var circle = require ( './circle.js' ) ;
console . log ( 'The area of a circle of radius 4 is '
+ circle . area ( 4 ) ) ;
Содержимое Circle.js:
var PI = Math . PI ;
exports . area = function ( r ) {
return PI * r * r ;
} ;
exports . circumference = function ( r ) {
return 2 * PI * r ;
} ;
Модуль Circle.js выводит две функции: area() и окружность(). Чтобы экспортировать объект, просто добавьте его в специальный экспорт объектов.
Обратите внимание, что экспорт — это ссылка на модуль.exports, просто для удобства. Если вы хотите экспортировать один элемент, например конструктор, вам нужно использовать модуль.exports.
// 正确输出构造函数
module . exports = MyConstructor ;
Локальные переменные внутри модуля являются частными. В этом примере переменная PI является частной для Circle.js.
Рассмотрим такую ситуацию:
a.js
console . log ( 'a starting' ) ;
exports . done = false ;
var b = require ( './b.js' ) ;
console . log ( 'in a, b.done = %j' , b . done ) ;
exports . done = true ;
console . log ( 'a done' ) ;
б.джс
console . log ( 'b starting' ) ;
exports . done = false ;
var a = require ( './a.js' ) ;
console . log ( 'in b, a.done = %j' , a . done ) ;
exports . done = true ;
console . log ( 'b done' ) ;
main.js
console . log ( 'main starting' ) ;
var a = require ( './a.js' ) ;
var b = require ( './b.js' ) ;
console . log ( 'in main, a.done=%j, b.done=%j' , a . done , b . done ) ;
Сначала main.js загружает a.js, а затем a.js загружает b.js. В это время b.js попытается загрузить a.js. Чтобы предотвратить бесконечные циклы, a.js вернет незаконченную копию в b.js. Затем b.js прекратит загрузку и вернет свой объект экспорта в модуль a.js.
Таким образом, main.js загрузил оба модуля. Вывод этой программы следующий:
main starting
a starting
b starting
in b , a . done = false
b done
in a , b . done = true
a done
in main , a . done = true , b . done = true
Как и NodeJS, обычно циклически зависимые модули не приводят к бесконечному циклу. Однако, если вы напрямую выполняете методы других модулей при загрузке модуля, вам будет предложено, что соответствующий метод не может быть найден, поэтому вам следует избегать такой ситуации. .
// a.js
var b = require ( './b.js' ) ;
exports . add = function ( m , n ) {
console . info ( m + n ) ;
} ;
// b.js
var a = require ( './a' ) ;
var m = 101 , n = 102 ;
exports . result = function ( ) {
a . add ( m , n ) ; // 此处没有问题
} ;
a . add ( m , n ) ; // 此处会报错,找不到a.add方法
Если имя файла не найдено, NodeAsp добавит суффиксы .js
и .json
и попытается загрузиться еще раз.
.js
будет анализироваться как обычный текстовый файл Javascript, а .json
будет анализироваться как обычный текстовый файл в формате JSON.
Если модуль имеет префикс «/», он представляет собой абсолютный путь. Например, require('/home/marco/foo.js') загружает файл /home/marco/foo.js.
Если модуль имеет префикс «./», путь указывается относительно файла, вызывающего require(). Другими словами, Circle.js должен находиться в том же каталоге, что и foo.js, чтобы метод require('./circle') мог его найти.
Если файл не указан с помощью '/' или './', модуль загружается из папки node_modules.
Если указанный путь не существует, require() выдаст ошибку.
ПРИМЕЧАНИЕ. Учитывая, что на хосте IIS файлы
.js
доступны непосредственно через браузер, поэтому, если вы не хотите утечки исходного кода, вы также можете использовать любой суффикс файла.
Если имя модуля в require() не является локальным модулем и не начинается с '/', '../' или './', то узел начнет работу с родительского каталога текущего модуля и попытается добавить его / Загрузите соответствующий модуль в папку node_modules.
Если он не найден, перейдите в родительский каталог, пока не дойдете до верхнего местоположения каталога.
Например, если файл, расположенный по адресу '/home/ry/projects/foo.js', вызывает require('bar.js'), то узел location ищет:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
Вы можете поместить программы и библиотеки в отдельную папку и предоставить к ней единую точку входа. Существует три способа разрешить загрузку папки в качестве параметра require().
Первым шагом является создание файла package.json в корневом каталоге папки, в котором необходимо указать основной модуль. Ниже приведен пример файла package.json.
{
"name" : "some-library" ,
"main" : "./lib/some-library.js"
}
Если этот файл в примере размещен в каталоге ./some-library, то require('./some-library') загрузит ./some-library/lib/some-library.js.
Если в каталоге нет файла package.json, узел попытается загрузить index.js по этому пути.
Модули кэшируются после первой загрузки. Это означает, что (как и другие кэши) один и тот же объект будет возвращаться каждый раз, когда вызывается require('foo'), и, конечно же, каждый раз необходимо анализировать один и тот же файл.
Многократный вызов require(foo) не обязательно приводит к многократному выполнению кода в модуле. С помощью этой функции можно возвращать частично завершенные объекты, а также загружать транзитивные зависимости; , даже если они могут вызвать циклы.
Если вы хотите, чтобы модуль выполнялся несколько раз, экспортируйте функцию, а затем вызовите ее.
Кэширование модулей основано на анализируемых именах файлов. Поскольку в зависимости от места вызова могут анализироваться разные файлы (например, при загрузке из папки node_modules), нет гарантии, что require('foo') всегда будет возвращать точный файл, если он анализируется на другие файлы. тот же объект.
В каждом модуле переменная модуль является ссылкой на объект, представляющий текущий модуль. В частности, модуль.exports можно получить посредством экспорта объектов глобального модуля. Модуль на самом деле не является глобальным объектом, а является более внутренним для каждого модуля.
Объект Module.exports генерируется через систему модулей. Таким образом, вам нужно только назначить экспортируемый объект в module.exports
. Например, мы также можем использовать следующий метод для написания Circle.js, который полностью эквивалентен.
// circle.js
var PI = Math . PI ;
var circle = { } ;
circle . area = function ( r ) {
return PI * r * r ;
} ;
circle . circumference = function ( r ) {
return 2 * PI * r ;
} ;
module . exports = circle ;
Идентификатор, используемый для различения модулей. Обычно полностью проанализированное имя файла.
Полностью разрешенное имя файла модуля.
Модуль, который импортирует этот модуль.
При использовании require() для ссылки на модуль выполняется следующий процесс для поиска целевого модуля на основе выражения.
require ( X ) from module at path Y
1. If X begins with './' or '/' or '../'
a . LOAD_AS_FILE ( Y + X )
b . LOAD_AS_DIRECTORY ( Y + X )
2. LOAD_NODE_MODULES ( X , dirname ( Y ) )
3. THROW "not found"
LOAD_AS_FILE ( X )
1. If X is a file , load X as JavaScript text . STOP
2. If X . js is a file , load X . js as JavaScript text . STOP
3. If X . json is a file , parse X . json to a JavaScript Object . STOP
LOAD_AS_DIRECTORY ( X )
1. If X / package . json is a file ,
a . Parse X / package . json , and look for "main" field .
b . let M = X + ( json main field )
c . LOAD_AS_FILE ( M )
2. If X / index . js is a file , load X / index . js as JavaScript text . STOP
3. If X / index . json is a file , parse X / index . json to a JavaScript object . STOP
LOAD_NODE_MODULES ( X , START )
1. let DIRS = NODE_MODULES_PATHS ( START )
2. for each DIR in DIRS :
a . LOAD_AS_FILE ( DIR / X )
b . LOAD_AS_DIRECTORY ( DIR / X )
NODE_MODULES_PATHS ( START )
1. let PARTS = path split ( START )
2. let I = count of PARTS - 1
3. let DIRS = [ ]
4. while I >= 0 ,
a . if PARTS [ I ] = "node_modules" CONTINUE
c . DIR = path join ( PARTS [ 0 . . I ] + "node_modules" )
b . DIRS = DIRS + DIR
c . let I = I - 1
5. return DIRS
Встроенные модули, такие как NodeJS, должны быть необходимы, прежде чем их можно будет использовать.
Этот модуль используется для написания модульных тестов для программы и вызывается через require('assert'). Портировано напрямую с NodeJS.
Модуль обработки событий, перенесенный непосредственно из NodeJS.
Модуль операций с файлами совместим с методами API синхронной работы большинства модулей операций с файлами NodeJS.
Модуль HTTP-запросов и обработки. Портированы и модифицированы из NodeJS, большинство из них совместимы.
Этот модуль содержит набор инструментов для обработки и преобразования путей к файлам. Почти все методы выполняют только преобразование строк и не вызывают файловую систему для проверки правильности пути.
Портирован и модифицирован из NodeJS, почти полностью совместим.
Кодирует и декодирует URL-адреса, полностью совместимые с NodeJS.
Обрабатывает строки запросов URL, полностью совместимые с NodeJS.
Этот модуль содержит служебные функции для анализа URL-адресов. Используйте require('url') для вызова этого модуля.
Полностью совместим с NodeJS.
Модуль вспомогательного метода, совместимый с версиями NodeJS ниже 4.0.
Для компиляции исходного кода NodeAsp требуется установка среды узла и глобальная установка uglifyJS.
Просто выполните node build
в командной строке. Скомпилированные файлы находятся в каталоге пакета.
C:DiskprojectsNodeAsp>node build
-----------------------
# build nodeAsp success
+ build/NodeAsp.min.asp
@ 2016-03-01 13:46:04
-----------------------
Массачусетский технологический институт