NodeAsp adalah seperangkat kerangka ASP Klasik, yang mengacu pada ide modular NodeJS, memungkinkan Anda dengan senang hati menulis program ASP menggunakan konsep baru.
Penggunaan NodeAsp memerlukan spesifikasi CommonJS dan sepenuhnya kompatibel dengan metode pemuatan modul NodeJS, memungkinkan Anda untuk langsung menggunakan lebih dari 50% modul NodeJS. Semua modul yang tidak ada hubungannya dengan lingkungan berjalan NodeJS dan objek spesifik ES5-ES6 dapat digunakan secara langsung. Perpustakaan sumber daya modul sebesar itu belum pernah tersedia dalam kerangka ASP mana pun di masa lalu.
NodeAsp adalah kerangka kerja unik dan inovatif di bidang ASP. Kemunculannya telah mengubah model penulisan ASP tradisional, memungkinkan Anda menyelesaikan pengembangan front-end dan back-end pada saat yang sama hanya dengan mengetahui js, dan menghilangkan proses penerapan yang membosankan. Server NodeJS.
NodeAsp di sini sebagai terminator di bidang ASP.
NodeAsp: http://nodeasp.com
Pengunduhan modul: http://nap.webkits.cn
Kerangka kerja ini hanya berjalan pada platform WIN IIS. Biasanya virtual host ASP biasa dapat menjalankan framework ini.
default.asp
<!-- #include file="NodeAsp.asp" -->
<%
require( ' ./index.js');
%>indeks.js
var http = require ( 'http' ) ;
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . end ( 'Hello Worldn' ) ;
} ) ; Langkah 1: Unduh NodeAsp.
Langkah 2: Referensi NodeAsp.
<!--#include file="NodeAsp.min.asp" -->Langkah 3: Gunakan NodeAsp.
< %
var version = process.version;
Response.Write(version);
% > Objek-objek ini tersedia di semua modul. Beberapa objek sebenarnya tidak berada dalam lingkup global, tetapi hanya dalam lingkup modul - situasi ini secara khusus ditunjukkan dalam dokumentasi berikut.
Di browser, cakupan tingkat atas adalah cakupan global. Artinya di browser, var Something akan mendeklarasikan variabel global jika saat ini berada dalam lingkup global. Ini berbeda di NodeAsp. Cakupan tingkat atas bukanlah cakupan global, var sesuatu dalam modul NodeAsp hanya milik modul itu.
Keluarkan beberapa informasi tentang lingkungan yang sedang berjalan.
Di NodeAsp, tujuan utama keberadaan proses adalah agar kompatibel dengan modul NodeJS tertentu, yang biasanya tidak digunakan.
Digunakan untuk mencetak keluaran standar dan kesalahan standar.
Lihat bagian控制台di bawah untuk detailnya.
Kami telah memperkenalkan modul buffer agar kompatibel dengan Buffer NodeJS. Harap dicatat bahwa modul buffer harus disertakan di bawah node_modules untuk menggunakan Buffer.
Jika Anda lupa meletakkan modul buffer di bawah node_modules, ini tidak akan mempengaruhi operasi normal program. Kesalahan hanya akan terjadi saat Anda menggunakan Buffer.
Impor modul. Sedikit berbeda dengan NodeJS adalah karena IIS hanya dapat mengeksekusi file ASP secara langsung, bukan file JS, require juga dapat digunakan untuk memerlukan modul dalam kode ASP. Mirip dengan mengeksekusi node test.js pada baris perintah.
Jika Anda ingin mengetahui jalur file sebenarnya saat memanggil metode require() untuk memuat modul, Anda dapat menggunakan metode require.resolve() untuk mendapatkannya.
Lihat bagian模块di bawah untuk detailnya.
Jalur file dari file kode yang sedang dijalankan. Ini adalah jalur absolut yang diurai ke file kode.
Misalnya: jalankan C:websitesnodeaspindex.asp
// module.js
Response . Write ( __filename ) ;
// C:websitesnodeaspmodule.js
// index.asp
require ( './module' ) ;
Response . Write ( __filename ) ;
// C:websitesnodeaspindex.aspNama direktori dari direktori tempat skrip dijalankan saat ini.
Referensi ke modul saat ini. Secara khusus, module.exports dan ekspor menunjuk ke objek yang sama. Modul sebenarnya tidak bersifat global tetapi bersifat lokal untuk setiap modul.
Lihat bagian模块di bawah untuk detailnya.
Referensi ke objek module.exports, yang digunakan bersama oleh semua instance modul saat ini dan dapat diakses melalui require(). Detail tentang kapan menggunakan ekspor dan kapan menggunakan module.exports dapat ditemukan di dokumentasi sistem modul. Ekspor sebenarnya tidak bersifat global tetapi lokal untuk setiap modul.
Lihat bagian模块di bawah untuk detailnya.
Fungsi pengatur waktu mencakup empat fungsi berikut. Karena ASP adalah single-threaded, fungsi-fungsi berikut sebenarnya tidak kompatibel.
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)
Untuk men-debug program ASP dengan lebih baik, kami menerapkan alat debugging baris perintah yang mirip dengan browser NodeJS/Chrome. Alamat unduhan: https://github.com/Spikef/NodeAsp-Console
CATATAN: IIS7.5 dan .NET4 diperlukan untuk dijalankan, dan lingkungan lain belum diuji.
Buka CMD dengan hak administrator dan gunakan perintah REGASM untuk mendaftarkan komponenTerminal.dll, di mana REGASM terletak di C:WindowsMicrosoft.NETFrameworkv4.0.30319 (lokasi spesifik terkait dengan nomor versi).
C:WindowsMicrosoft.NETFrameworkv4.0.30319REGASM D:componentTerminal.dll /codebase
Untuk sistem 32-bit, temukan lokasi registri berikut:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
Untuk sistem 64-bit, temukan lokasi registri berikut:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
Pilih atau buat item baru FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701 , lalu buat nilai DWORD baru:
Nama: w3wp.exe Nilai: 1
Klik dua kali Console.exe untuk membuka baris perintah debugging NodeAsp.
Masukkan kode berikut pada default.asp, lalu akses default.asp melalui browser. Selanjutnya Anda bisa melihat hasilnya di Console.exe .
var a = { name : "nodeasp" , value : true }
// 在console中将输出
//{
// name: "nodeasp",
// value: true
//}Output ke Konsol, menggunakan warna default.
var a = { name : "NodeAsp" , version : "0.0.1" } ;
console . log ( a ) ; Untuk output ke Konsol, gunakan warna hijau.
Untuk output ke Konsol, gunakan warna merah. Khususnya, jika keluarannya adalah objek Error, pesan kesalahan lengkap akan ditampilkan.
Untuk output ke Konsol, gunakan warna kuning.
Gunakan label untuk menentukan nama dan memulai pengatur waktu untuk menghitung waktu yang diperlukan untuk pengoperasian.
Keluarkan waktu yang diperlukan untuk suatu operasi.
Contoh:
console . time ( '100-elements' ) ;
for ( var i = 0 ; i < 100 ; i ++ ) {
;
}
console . timeEnd ( '100-elements' ) ;
// prints 100-elements: 262msAnda dapat memasukkan perintah berikut di konsol.
cls/clear: Hapus informasi debug dan tidak dapat dipulihkan.
tentang: Menampilkan tentang informasi.
copylast: Menyalin pesan keluaran sebelumnya.
copyall: Menyalin semua informasi keluaran.
NodeAsp memiliki sistem pemuatan modul yang hampir sama dengan NodeJS, yang memastikan NodeAsp dapat langsung menggunakan modul NodeJS dalam jumlah besar.
Inti dari NodeAsp hampir tidak berisi fungsi yang diperlukan untuk pengembangan situs web, dan semua fungsi diperluas melalui modul. Anda dapat menemukan modul fungsi yang Anda perlukan melalui pusat modul NodeAsp atau NPM.
Di NodeAsp, file dan modul memiliki korespondensi satu-ke-satu. Di bawah ini adalah contoh foo.js memuat Circle.js di direktori yang sama.
Isi foo.js
var circle = require ( './circle.js' ) ;
console . log ( 'The area of a circle of radius 4 is '
+ circle . area ( 4 ) ) ;Isi dari lingkaran.js:
var PI = Math . PI ;
exports . area = function ( r ) {
return PI * r * r ;
} ;
exports . circumference = function ( r ) {
return 2 * PI * r ;
} ;Modul Circle.js menghasilkan dua fungsi, area() dan keliling(). Untuk mengekspor suatu objek, cukup tambahkan objek tersebut ke ekspor objek khusus.
Perhatikan bahwa ekspor adalah referensi ke module.exports, hanya untuk kenyamanan. Saat Anda ingin mengekspor satu item seperti konstruktor, Anda perlu menggunakan module.exports.
// 正确输出构造函数
module . exports = MyConstructor ;Variabel lokal dalam modul bersifat pribadi. Dalam contoh ini, variabel PI bersifat pribadi untuk Circle.js.
Pertimbangkan situasi ini:
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 ) ;Pertama, main.js memuat a.js, lalu a.js memuat b.js. Saat ini, b.js akan mencoba memuat a.js. Untuk mencegah loop tak terbatas, a.js akan mengembalikan salinan yang belum selesai ke b.js. Kemudian b.js akan berhenti memuat dan mengembalikan objek ekspornya ke modul a.js.
Dengan cara ini, main.js telah memuat kedua modul. Output dari program ini adalah sebagai berikut:
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 = trueSeperti NodeJS, biasanya modul yang bergantung secara siklis tidak akan menghasilkan loop tak terbatas. Namun, jika Anda langsung menjalankan metode modul lain saat modul dimuat, Anda akan diminta bahwa metode yang sesuai tidak dapat ditemukan, jadi sebaiknya hindari situasi ini. .
// 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方法 Jika nama file tidak ditemukan, NodeAsp akan menambahkan akhiran .js dan .json dan mencoba memuat lagi.
.js akan diuraikan sebagai file teks biasa Javascript, dan .json akan diuraikan sebagai file teks biasa dalam format JSON.
Jika modul diawali dengan '/', ini mewakili jalur absolut. Misalnya, require('/home/marco/foo.js') memuat file /home/marco/foo.js.
Jika modul diawali dengan './', jalurnya relatif terhadap pemanggilan file require(). Dengan kata lain, Circle.js harus berada di direktori yang sama dengan foo.js agar require('./circle') dapat menemukannya.
Ketika file tidak diarahkan dengan '/' atau './', modul dimuat dari folder node_modules.
Jika jalur yang ditentukan tidak ada, require() akan menimbulkan kesalahan.
CATATAN: Mengingat pada host IIS, file
.jsdapat diakses langsung melalui browser, jadi jika tidak ingin membocorkan kode sumbernya, Anda juga dapat menggunakan akhiran file apa pun.
Jika nama modul di require() bukan modul lokal dan tidak dimulai dengan '/', '../', atau './', maka node akan memulai dari direktori induk modul saat ini dan mencoba menambahkan ke / Muat modul yang sesuai di folder node_modules.
Jika tidak ditemukan, maka pindahkan ke direktori induk hingga mencapai lokasi direktori teratas.
Misalnya, jika file terletak di '/home/ry/projects/foo.js' memanggil require('bar.js'), maka lokasi yang dicari node adalah:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
Anda dapat menempatkan program dan perpustakaan ke dalam folder terpisah dan menyediakan satu titik masuk ke dalamnya. Ada tiga cara untuk mengaktifkan folder agar dimuat sebagai parameter yang diperlukan().
Langkah pertama adalah membuat file bernama package.json di direktori root folder, yang perlu menentukan modul utama. Di bawah ini adalah contoh file package.json.
{
"name" : "some-library" ,
"main" : "./lib/some-library.js"
}Jika file dalam contoh ini ditempatkan di bawah direktori ./some-library, maka require('./some-library') akan memuat ./some-library/lib/some-library.js.
Jika tidak ada file package.json di direktori, node akan mencoba memuat index.js di jalur ini.
Modul di-cache setelah pertama kali dimuat. Artinya (seperti cache lainnya) objek yang sama akan dikembalikan setiap kali require('foo') dipanggil, dan tentu saja, file yang sama harus diurai setiap kali.
Memanggil require(foo) beberapa kali tidak selalu menyebabkan kode dalam modul dieksekusi beberapa kali. Ini adalah fitur penting. Dengan fitur ini, dimungkinkan untuk mengembalikan objek yang sudah selesai sebagian dengan cara ini, dependensi transitif juga dapat dimuat , meskipun hal tersebut dapat menyebabkan ketergantungan loop.
Jika Anda ingin modul dijalankan beberapa kali, ekspor suatu fungsi lalu panggil fungsi tersebut.
Caching modul bergantung pada nama file yang diurai. Karena file yang berbeda mungkin diurai tergantung pada lokasi panggilan (misalnya, saat memuat dari folder node_modules), tidak ada jaminan bahwa require('foo') akan selalu mengembalikan file persisnya jika diurai ke file lain. objek yang sama.
Di setiap modul, modul variabel adalah referensi ke objek yang mewakili modul saat ini. Secara khusus, module.exports dapat diperoleh melalui ekspor objek modul global. module sebenarnya bukan objek global, tetapi lebih bersifat internal untuk setiap modul.
Objek module.exports dihasilkan melalui sistem modul. Oleh karena itu, Anda hanya perlu menetapkan objek yang akan diekspor ke module.exports . Misalnya, kita juga bisa menggunakan metode berikut untuk menulis Circle.js, yang sepenuhnya setara.
// 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 ; Identifier digunakan untuk membedakan modul. Biasanya nama file yang diurai sepenuhnya.
Nama file modul yang terselesaikan sepenuhnya.
Modul yang mengimpor modul ini.
Saat menggunakan require() untuk mereferensikan modul, proses berikut diikuti untuk menemukan modul target berdasarkan ekspresi.
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 Modul bawaan, seperti NodeJS, harus diperlukan sebelum dapat digunakan.
Modul ini digunakan untuk menulis kasus pengujian unit untuk program dan dipanggil melalui require('assert'). Diporting langsung dari NodeJS.
Modul pemrosesan acara, langsung ditransplantasikan dari NodeJS.
Modul operasi file kompatibel dengan metode API operasi sinkron di sebagian besar modul operasi file NodeJS.
Modul permintaan dan pemrosesan HTTP. Di-porting dan dimodifikasi dari NodeJS, sebagian besar kompatibel.
Modul ini berisi seperangkat alat untuk memproses dan mengonversi jalur file. Hampir semua metode hanya melakukan transformasi string dan tidak memanggil sistem file untuk memeriksa apakah jalurnya valid.
Porting dan dimodifikasi dari NodeJS, hampir sepenuhnya kompatibel.
Mengkodekan dan mendekode URL, sepenuhnya kompatibel dengan NodeJS.
Menangani string kueri URL, sepenuhnya kompatibel dengan NodeJS.
Modul ini berisi fungsi utilitas untuk penguraian URL. Gunakan require('url') untuk memanggil modul ini.
Sepenuhnya kompatibel dengan NodeJS.
Modul metode tambahan, kompatibel dengan versi NodeJS di bawah 4.0.
Mengkompilasi kode sumber NodeAsp memerlukan instalasi lingkungan node dan instalasi uglifyJS secara global.
Jalankan saja node build pada baris perintah. File yang dikompilasi terletak di direktori bundel.
C:DiskprojectsNodeAsp>node build
-----------------------
# build nodeAsp success
+ build/NodeAsp.min.asp
@ 2016-03-01 13:46:04
-----------------------
MIT