NodeAsp
는 NodeJS의 모듈식 아이디어를 활용한 클래식 ASP 프레임워크 세트로, 새로운 개념을 사용하여 ASP 프로그램을 즐겁게 작성할 수 있도록 해줍니다.
NodeAsp
CommonJS 사양을 따르며 NodeJS 모듈 로딩 방식과 완벽하게 호환되는 require를 사용하므로 NodeJS 모듈의 50% 이상을 직접 사용할 수 있습니다. 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에서는 다릅니다. 최상위 범위는 전역 범위가 아니며 NodeAsp 모듈의 var 항목은 해당 모듈에만 속합니다.
실행 중인 환경에 대한 일부 정보를 출력합니다.
NodeAsp에서 프로세스 존재의 주요 목적은 일반적으로 사용되지 않는 특정 NodeJS 모듈과 호환되는 것입니다.
표준 출력 및 표준 오류를 인쇄하는 데 사용됩니다.
자세한 내용은 아래控制台
섹션을 참조하세요.
NodeJS의 Buffer와 호환되도록 버퍼 모듈을 도입했습니다. Buffer를 사용하려면 반드시 node_modules 하위에 버퍼 모듈이 포함되어 있어야 합니다.
node_modules 아래에 버퍼 모듈을 넣는 것을 잊어버린 경우, 이는 프로그램의 정상적인 작동에 영향을 미치지 않습니다. Buffer를 사용할 때만 오류가 발생합니다.
모듈을 가져옵니다. NodeJS와 조금 다른 점은 IIS가 JS 파일 대신 ASP 파일만 직접 실행할 수 있기 때문에 require를 사용하여 ASP 코드에서 모듈을 요구할 수도 있다는 것입니다. 명령줄에서 node 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 및 내보내기는 동일한 객체를 가리킵니다. 모듈은 실제로 전역이 아니라 각 모듈에 대해 로컬입니다.
자세한 내용은 아래模块
섹션을 참조하세요.
현재 모듈의 모든 인스턴스에서 공유되고 require()를 통해 액세스할 수 있는 module.exports 객체에 대한 참조입니다. 내보내기를 사용하는 경우와 module.exports를 사용하는 경우에 대한 자세한 내용은 모듈 시스템 설명서에서 확인할 수 있습니다. 내보내기는 실제로 전역이 아니라 각 모듈에 대해 로컬입니다.
자세한 내용은 아래模块
섹션을 참조하세요.
타이머 기능에는 다음 4가지 기능이 포함됩니다. ASP는 단일 스레드이므로 다음 기능은 실제로 호환되지 않습니다.
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)
ASP 프로그램을 더 효과적으로 디버깅하기 위해 NodeJS/Chrome 브라우저와 유사한 명령줄 디버깅 도구를 구현했습니다. 다운로드 주소: https://github.com/Sikef/NodeAsp-Console
참고: 실행하려면 IIS7.5 및 .NET4가 필요하며 다른 환경은 테스트되지 않았습니다.
관리자 권한으로 CMD를 열고 REGASM 명령을 사용하여 componentTerminal.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에서 파일과 모듈은 일대일 대응을 갖습니다. 다음은 동일한 디렉터리에 foo.js가 Circle.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() 및circference()라는 두 가지 함수를 출력합니다. 개체를 내보내려면 특수 개체 내보내기에 해당 개체를 추가하기만 하면 됩니다.
내보내기는 편의상 module.exports에 대한 참조입니다. 생성자와 같은 단일 항목을 내보내려면 module.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' ) ;
b.js
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는 require('./circle')가 찾을 수 있도록 foo.js와 동일한 디렉터리에 있어야 합니다.
'/' 또는 './'으로 파일을 가리키지 않으면 node_modules 폴더에서 모듈을 로드합니다.
지정된 경로가 존재하지 않으면 require()에서 오류가 발생합니다.
참고: IIS 호스트에서는 브라우저를 통해
.js
파일에 직접 액세스할 수 있으므로 소스 코드 유출을 원하지 않으면 모든 파일 접미사를 사용할 수도 있습니다.
require()의 모듈 이름이 로컬 모듈이 아니고 '/', '../' 또는 './'으로 시작하지 않으면 노드는 현재 모듈의 상위 디렉터리에서 시작하여 추가를 시도합니다. node_modules 폴더에 해당 모듈을 로드/로드합니다.
찾을 수 없으면 최상위 디렉터리 위치에 도달할 때까지 상위 디렉터리로 이동합니다.
예를 들어, '/home/ry/projects/foo.js'에 있는 파일이 require('bar.js')를 호출하는 경우 노드가 찾는 위치는 다음과 같습니다.
/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')가 다른 파일로 구문 분석되는 경우 항상 정확한 파일을 반환한다는 보장은 없습니다. 같은 개체.
각 모듈에서 변수 모듈은 현재 모듈을 나타내는 개체에 대한 참조입니다. 특히, module.exports는 전역 모듈 객체 내보내기를 통해 얻을 수 있습니다. module은 실제로 전역 개체가 아니지만 각 모듈의 내부에 더 가깝습니다.
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에서 직접 이식한 이벤트 처리 모듈입니다.
파일 작업 모듈은 대부분의 NodeJS 파일 작업 모듈의 동기 작업 API 메서드와 호환됩니다.
HTTP 요청 및 처리 모듈. NodeJS에서 이식 및 수정되었으며 대부분 호환됩니다.
이 모듈에는 파일 경로를 처리하고 변환하기 위한 도구 세트가 포함되어 있습니다. 거의 모든 메소드는 문자열 변환만 수행하며 경로가 유효한지 확인하기 위해 파일 시스템을 호출하지 않습니다.
NodeJS에서 이식 및 수정되었으며 거의 완벽하게 호환됩니다.
NodeJS와 완벽하게 호환되는 URL을 인코딩하고 디코딩합니다.
NodeJS와 완벽하게 호환되는 URL 쿼리 문자열을 처리합니다.
이 모듈에는 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
-----------------------
MIT