在Go模板中包含js文件

我最近开始学习Go。 我有一个像web应用程序的样本。 我有:

/* tick-tock.go */ package main import ( "fmt" "io/ioutil" "log" "net/http" ) // Content for the main html page.. var page = `     div { font-family: "Times New Roman", Georgia, Serif; font-size: 1em; width: 13.3em; padding: 8px 8px; border: 2px solid #2B1B17; color: #2B1B17; text-shadow: 1px 1px #E5E4E2; background: #FFFFFF; }    

Go Timer

var myDelay; $(document).ready(function () { $("#output").append("Waiting for system time.."); myDelay = setInterval("delayedPost()", 1000); }); function delayedPost() { $.post("http://localhost:9999/dev", "", function(data, status) { //$("#output").empty(); $("#output").prepend(data); }); $.post("http://localhost:9999/v1", "", function(data, status) { //$("#output").empty(); $("#v1").prepend(data); }); $.post("http://localhost:9999/v2", "", function(data, status) { //$("#output").empty(); $("#v2").prepend(data); }); } function delayedPost1() { $.post("http://localhost:9999/dev", "", function(data, status) { $("#output").prepend(data); }); $.post("http://localhost:9999/v1", "", function(data, status) { $("#v1").prepend(data); }); $.post("http://localhost:9999/v3", "", function(data, status) { $("#v2").prepend(data); }); } function changeUrl() { alert('salom'); clearInterval(myDelay); } ` // handler for the main page. func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, page) } // handler to cater AJAX requests func handlerDevs(w http.ResponseWriter, r *http.Request) { //fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST")) fmt.Fprint(w, "Dev1
") } func handlerV1(w http.ResponseWriter, r *http.Request) { //fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST")) fmt.Fprint(w, "Vertical1
") } func handlerV2(w http.ResponseWriter, r *http.Request) { //fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST")) fmt.Fprint(w, "Vertical2
") } func main() { http.HandleFunc("/", handler) http.HandleFunc("/dev", handlerDevs) http.HandleFunc("/v1", handlerV1) http.HandleFunc("/v2", handlerV2) log.Fatal(http.ListenAndServe(":9999", nil)) http.HandleFunc("/jquery.min.js", SendJqueryJs) panic(http.ListenAndServe(":8081", nil)) } func SendJqueryJs(w http.ResponseWriter, r *http.Request) { data, err := ioutil.ReadFile("jquery.min.js") if err != nil { http.Error(w, "Couldn't read file", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/javascript") w.Write(data) }

我无法加载本地jquery.min.js 。 当我写src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"它已被加载。 如何加载本地js文件? 我不擅长Go中的编码而且我没有编写完整的代码。 所以请尽量解释一下。 提前致谢!

您需要HandlerHandlerFunc ,它会在请求时将文件内容( jquery.min.js )发送到Web浏览器。

你有3个选择:

手动做

这是更复杂的解决方案。 看起来在您的处理函数中,您读取文件的内容,设置正确的响应内容类型( application/javascript )并将内容(这是[]byte )发送到响应。

需要注意的事项:读取文件时,必须指定绝对路径。 如果指定相对路径,请确保该文件位于您启动应用程序的当前文件夹(工作目录)中。

例:

 func SendJqueryJs(w http.ResponseWriter, r *http.Request) { data, err := ioutil.ReadFile("jquery.min.js") if err != nil { http.Error(w, "Couldn't read file", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/javascript; charset=utf-8") w.Write(data) } func main() { http.HandleFunc("/jquery.min.js", SendJqueryJs) panic(http.ListenAndServe(":8081", nil)) } 

上面的示例只能为请求提供1个文件: jquery.min.js

 http://localhost:8081/jquery.min.js 

利用http.ServeFile()

这更容易:函数http.ServeFile()能够将一个文件的内容发送到指定的响应。 您仍然需要创建一个函数或处理程序来使用它,但它会为您完成剩下的工作:

 func SendJqueryJs(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "jquery.min.js") } 

利用http.FileServer()

如果需要提供多个静态文件,这就是FileServer()函数派上用场的地方,它会返回一个Handler ,它自动提供本地文件系统中的文件,这些文件是您指定的根文件夹的后代。

此解决方案更灵活:它可以发送多种类型的文件,自动检测和设置内容类型。 处理程序还能够呈现用于列出目录内容的HTML页面,其中包含指向文件和父/子文件夹的链接。

例:

 http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp")))) 

这将在URL /tmpfiles/注册一个Handler ,它在/tmp文件夹中提供本地文件系统中的文件。 例如,以下链接:

  

将从服务器获取/tmp/jsquery.min.js文件。

查看此答案,详细说明如何使用/启动静态文件服务器 。