using java style import to include javascript files
I had used a function and a little bootstrapping trick to solve my problem with including files in PHP and I was happy with it.
But recently while working on a project that has a heavy javascript codebase, I started having trouble managing all javascript file imports and all those script tags made pages look really ugly.
And also I really longed for java’s clas importing capabilities in javascript such that I could import a single file based on package name or I could import a whole package.
Since some of the pages I’m working requires over 15 script imports, some third-party libraries and some of our own files.
And importing scripts one by one suffers from latency problems as it increases page load time and can contribute to user annoyances.
So I longed for java’s style of package and class import and decided to try my hand on writing some script to emulate imports based on packages.
I jsut used the similar principle I used with php, but the problem is importing all files in a package isn’t possible in javascript because javascript cannot read files form disk let alone iterate through a folder and read file content.
For that there was nothing I could do except use some server-side help.
here’s the js file code with function for importing js file and js files contained in a package(folder).
//create namespace to aviod any present/ future variable/object/funciton conflicts
if (typeof Anzaan == "undefined" || !Anzaan) {
Anzaan = {};
}
// array to hold all imported files so as not to import them twice
Anzaan.imports = [];
//server side URL for loading whole package content
Anzaan.packageLoaderURL='/Framework/packageLoader/';
//set the base folder for importing files
Anzaan.importBase='js/';
/**
* import a class using the java naming syntax for a class name.
*@param module the module to import
*@param config object literal with two properties-
* config.packageLoaderURL - the server url for loading all files in a folder/package as a stream
* config.importBase - the base path for importing files
* use config only if necessary otherwise just modify Anzaan.packageLoaderURL and Anzaan.importBase
* of course you can use a different namespace or just use no namespace
*/
function Import(module, config) { //com.anzaan.framework.*
if(config){
if(config.packageLoaderURL)
Anzaan.packageLoaderURL=config.packageLoaderURL;
if(config.importBase)
Anzaan.importBase=config.importBase;
}
// if this import has already happened, don't bother,
if (Anzaan.imports[module] )
return ;
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
var src='';
var folders=module.split(".");
for(var i=0;i<folders.length;i++){
if(folders[i].indexOf('*') < 0)
src+=folders[i]+"/";
}
src=src.substring(0,src.length-1);//remove the last slash
if (module.indexOf('*') < 0) { //if not package import
src=Anzaan.importBase+src+".js";
script.src=src;
} else {
script.src=Anzaan.packageLoaderURL+"?package="+Anzaan.importBase+src;
}
head.appendChild(script);
Anzaan.imports[module] = module;
}
The config parameter is optional. It shouldn’t really be used unless you want to load files from locations other tahn the default location of your application and want to use other URL for loading script files.
Just modify the global variables Anzaan.packageLoaderURL and Anzaan.importBase to set the base path and the serverside URL for loading scripts in folder.
And of course rename Anzaan to something more meaningful for you.
Now on the server side here’s a simple php script that services the script file requests.
It loads contents from js flies that reside in folder specified by ‘package’ variable.
packageLoader.php
————————————————
<?php
$folder=$_GET["package"]; // get the package name
$dir = opendir($folder); //open directory
while (($file = readdir($dir)) !== false) {
if (strrpos($file, '.js')) {
echo file_get_contents($folder.'/'.$file); //printout the content of file
}
}
?>
and here’s a Java Servlet for doing the same thing:
JSPackageLoaderServlet.java
public class JSPackageLoaderServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
ServletOutputStream out = response.getOutputStream();
String packagePath = request.getParameter("package");
StringBuilder sb = new StringBuilder();
File myDir = new File(getServletContext().getRealPath(packagePath));
if (myDir.exists() && myDir.isDirectory()) {
File[] files = myDir.listFiles();
for (int y = 0; y < files.length; y++) {
String line = "";
BufferedReader in = new BufferedReader(new FileReader(files[y]));
while ((line = in.readLine()) != null) {
sb.append(line);
}
}
}
out.print(sb.toString());
}
}
Here’s the usage:
Import('anzaan.event.EvenHandler');