In some use cases, we don’t want to reference external libraries, javascript files, css files, etc.
In this case, I have created an application, that localizes the library in one static location and by coding an php script to generate a list of <link> and <script> tags.
This approach is trying to simplify and reuse the common knowledge to start build our php + vue based application.
The difference between the build tool and this php script is that, the script based solution is light and easy to extend. The build tool is heavy and need to install some dependency and also requires additional knowledge.

How to use
- Create a folder to hold your application
- Copy the Source Code “app.meta.json” to your application folder
- Copy the Source Code “vendor.php” to your application folder or sub folder.
- Create index.php in your application folder.
- Call vendor at the head of index.php.
<!doctype html>
<html>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<head>
<title>Example Site</title>
<?php
include_once($_SERVER["DOCUMENT_ROOT"]."/"."vendor.php") ;
?>
</head>
<body>
<div id="myapp">
<!-- My Vue Content -->
</div>
<script src="./myapp.vue.js" type="text/javascript"></script>
<body>
</html>
Vendor php argument
- Enable debug mode:
include_once($_SERVER["DOCUMENT_ROOT"]."/vendor/myphp/1.0.0/vendor.php?debug=1
Source code
Here are the source code files mentioned in the previous chapters.
app.meta.json
{
"description": "Science Olypaid - Fast Facts",
"dependencies": {
"jquery":"3.4.1",
"jqueryui":"1.13.2",
"boxicons":"2.1.4",
"localforage":"1.10.0",
"layer":"3.5.4",
"keymaster": "1.6.3",
"moment": "2.24.0",
"dragtable":"2.0.15",
"data-set":"0.11.8",
"bootstrap":"5.0.2",
"bootstrap-icons":"1.10.5",
"loglevel":"1.8.1",
"vue-typed-js": "0.2.0",
"vue-smart-widget": "2.6.10",
"vue":"2.6.14",
"vue-i18n":"5.0.3",
"element-ui":"2.5.14",
"jquery-treegrid":"0.3.0",
"bootstrap-table":"1.22.1",
"tableexport.jquery.plugin":"1.28.0",
"axios":"0.15.3",
"vue-axios":"2.0.2",
"echarts":"5.4.3",
"vue-echarts":"6.6.1",
"myjs":"0.0.1"
},
"scripts": {
"collect": "dev/collect.csh"
},
"entries": {
"index": {
"file": "index.php",
"version": "0.0.2",
"dependencies": {
},
"assets": {
"0.0.2": {
"css": [
"./myapp.css"
],
"js": [
],
"php": []
}
},
"ignore": {
}
}
}
}
vendor.php
<?php
if (isset($_SERVER["REQUEST_URI"]) && preg_match("/errmsg=((1)|(yes))/",$_SERVER["REQUEST_URI"])) {
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL) ;
} else {
error_reporting(1) ;
}
if (! function_exists(url_origin)) {
function url_origin( $s, $use_forwarded_host = false ) {
$ssl = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
$sp = strtolower( $s['SERVER_PROTOCOL'] );
$protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
$port = $s['SERVER_PORT'];
$port = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
$host = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );
$host = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;
return $protocol . '://' . $host;
}
}
if (! function_exists(full_url)) {
function full_url( $s, $use_forwarded_host = false ) {
return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];
}
}
if (!isset($app_dev)) {
$app_dev = array() ;
}
$app_devstat["vendor"] = false ;
$phpscr_root_array = glob("{../app.icsteve.com,../../app.icsteve.com,.}",GLOB_BRACE+GLOB_NOSORT) ;
$phpscr_root = realpath($phpscr_root_array[0]) ;
if (!isset($app_entry_name)) {
$app_entry_name = preg_replace("/vendor/","index",preg_replace("/.php$/","",basename($_SERVER["SCRIPT_FILENAME"]))) ;
}
if (!isset($app_root)) {
$app_root = realpath(".") ;
}
if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) {
include_once(__DIR__."/"."get_argument.php") ;
$args=get_argument() ;
$is_direct_call = true ;
$app_root = dirname(dirname(dirname(dirname(__DIR__)))) ;
if (isset($args["app_meta"])) {
$app_meta = $app_root."/".$args["app_meta"] ;
}
if (isset($args["app_entry_name"])) {
$app_entry_name = $args["app_entry_name"] ;
}
if (isset($args["app_devstat"])) {
$app_devstat["vendor"] = $args["app_devstat"] ;
}
} else {
$is_direct_call = false ;
}
echo "<!-- App entry name: ".$app_entry_name." -->".PHP_EOL ;
if (isset($app_root) && !isset($app_meta)) {
$fileList = get_included_files();
$tmpidx = count($fileList)-2 ;
$parent = $fileList[$tmpidx];
$app_meta_filename = preg_replace("/\.php/",".meta.json",basename($parent)) ;
$app_meta = $app_root."/".$app_meta_filename ;
}
if (! file_exists($app_meta)) {
$app_meta = $app_root."/app.meta.json" ;
}
if (! file_exists($app_meta)) {
# Exit php ;
}
$tmpurl = full_url($_SERVER) ;
$tmparr = explode("/",$tmpurl) ;
$tmparr = array_splice($tmparr,0,sizeof($tmparr)-1) ;
$pageroot_url = implode("/",$tmparr) ;
$tmpurl2 = preg_replace("/app.icsteve.com.*/","/app.icsteve.com/",$tmpurl) ;
$app_root_url = preg_replace("/.*app.icsteve.com\//","$tmpurl2",realpath($app_root)) ;
#echo $app_root_url.PHP_EOL ;
if ($app_devstat["vendor"]) {
echo "<!-- App root url: ".PHP_EOL." tmpurl: ".$tmpurl.PHP_EOL." tmpurl2:".$tmpurl2.PHP_EOL." app_root_url: ".$app_root_url.PHP_EOL."-->".PHP_EOL ;
}
if (isset($_SERVER["SERVER_NAME"])) {
$full_url = full_url($_SERVER) ;
} else {
$full_url = "." ;
}
$vendor_common = array("url"=>"http://cdn.icsteve.com/vendor") ;
$phpscr_dir = realpath($phpscr_root) ;
$vendor_server_path_array = glob("{".$phpscr_dir."/vendor,".$phpscr_dir."/vendor}",GLOB_BRACE+GLOB_NOSORT) ;
$vendor_server_path = $vendor_server_path_array[0] ;
$vendor_url_array = glob("{./vendor,../vendor,../../vendor,../../../vendor,../../../../vendor}",GLOB_BRACE+GLOB_NOSORT) ;
if (count($vendor_url_array)>0) {
$vendor_url = $vendor_url_array[0] ;
} else {
$vendor_url = "." ;
}
$vendor_url = $pageroot_url."/".$vendor_url ;
$metajson = json_decode(file_get_contents($app_meta),true) ;
#print_r($metajson) ;
# $myfile = fopen("copy.csh", "w") ;
$js_files = array() ;
$css_files = array() ;
$com_files = array() ;
$croot_url = preg_replace("#/app.icsteve.com/.*$#","/app.icsteve.com/",$app_root_url) ;
$croot_url = preg_replace("#^.*app.icsteve.com/#","$croot_url",realpath($app_root)) ;
#echo "<!--DIR: ".realpath($app_root)."-->".PHP_EOL ;
echo "<!-- Dependency list is from ".$croot_url."/".basename($app_meta)." -->".PHP_EOL ;
foreach ($metajson["dependencies"] as $dependency=>$version) {
#fwrite($myfile,$dependency.PHP_EOL) ;
#echo "Checking ".$vendor_server_path."/".$dependency."/meta.json\n ".$dependency." -> $version".PHP_EOL ;
$vendor_metajson = json_decode(file_get_contents($vendor_server_path."/".$dependency."/meta.json"), true) ;
# check license
#print_r($vendor_metajson) ;
$vendor_license = $vendor_metajson["assets"][$version]["license"] ;
if (! isset($vendor_metajson["assets"][$version]["css"])) {
echo "<!-- Check local $dependency => $version => css failed -->".PHP_EOL ;
if (isset($vendor_common["css"][$dependency][$version])) {
foreach ($vendor_common["css"][$dependency][$version] as $css_file) {
array_push($css_files,$css_file) ;
array_push($com_files,$css_file) ;
}
echo "<!-- Match the common css files for ".$dependency."/".$version."-->".PHP_EOL ;
}
} else {
$vendor_css = $vendor_metajson["assets"][$version]["css"] ;
foreach ($vendor_css as $css_file) {
if (isset($vendor_metajson["ignore"][$dependency])) {
if (in_array($css_file,$vendor_metajson["ignore"][$dependency])) {
continue ;
}
}
#echo '<link href="'.$vendor_url.'/'.$dependency."/".$version."/".$css_file.'" rel="stylesheet" crossorigin="anonymous" type="text/css">'.PHP_EOL ;
#echo $vendor_server_path."/".$dependency."/".$version."/".$css_file.PHP_EOL ;
array_push($css_files,$dependency."/".$version."/".$css_file) ;
}
}
if (! isset($vendor_metajson["assets"][$version]["js"]) ) {
if (isset($vendor_common["js"][$dependency][$version])) {
foreach ($vendor_common["js"][$dependency][$version] as $js_file) {
array_push($js_files,$js_file) ;
array_push($com_files,$js_file) ;
}
echo "<!-- Match the common js files for ".$dependency."/".$version."-->".PHP_EOL ;
}
echo "<!-- Check local $dependency => $version => js failed -->".PHP_EOL ;
} else {
$vendor_js = $vendor_metajson["assets"][$version]["js"] ;
foreach ($vendor_js as $js_file) {
# ignore list
if (isset($vendor_metajson["ignore"][$dependency])) {
if (in_array($js_file,$vendor_metajson["ignore"][$dependency])) {
continue ;
}
}
#echo '<script src="'.$vendor_url.'/'.$dependency."/".$version."/".$js_file.'" type="text/javascript"></script>'.PHP_EOL;
#echo $vendor_server_path."/".$dependency."/".$version."/".$js_file.PHP_EOL ;
array_push($js_files,$dependency."/".$version."/".$js_file) ;
}
}
}
if (isset($metajson["assets"])) {
$app_version = $metajson["version"] ;
$app_css = $metajson["assets"][$app_version]["css"] ;
$app_js = $metajson["assets"][$app_version]["js"] ;
} elseif (isset($metajson["entries"][$app_entry_name]["assets"])) {
$app_version = $metajson["entries"][$app_entry_name]["version"] ;
$app_css = $metajson["entries"][$app_entry_name]["assets"][$app_version]["css"] ;
$app_js = $metajson["entries"][$app_entry_name]["assets"][$app_version]["js"] ;
} else {
$app_css = array() ;
$app_js = array() ;
}
foreach (array_diff($css_files,$app_css) as $css_file) {
if (in_array($css_file,$com_files)) {
$tmpurl = $vendor_common["url"]."/".$css_file ;
} else {
$tmpurl = $vendor_url."/".$css_file ;
}
#echo '<link href="'.$tmpurl.'" rel="stylesheet" crossorigin="anonymous" type="text/css">'.PHP_EOL ;
echo '<link href="'.$tmpurl.'" rel="stylesheet" type="text/css">'.PHP_EOL ;
}
foreach (array_diff($js_files,$app_js) as $js_file) {
if (in_array($js_file,$com_files)) {
$tmpurl = $vendor_common["url"]."/".$js_file ;
} else {
$tmpurl = $vendor_url."/".$js_file ;
}
echo '<script src="'.$tmpurl.'" type="text/javascript"></script>'.PHP_EOL;
}
foreach ($app_css as $css_file) {
#echo '<link href="'.$app_root_url."/assets/vendor/".$css_file.'" rel="stylesheet" crossorigin="anonymous" type="text/css">'.PHP_EOL ;
echo '<link href="'.$app_root_url."/assets/vendor/".$css_file.'" rel="stylesheet" type="text/css">'.PHP_EOL ;
}
foreach ($app_js as $js_file) {
echo '<script src="'.$app_root_url."/assets/vendor/".$js_file.'" type="text/javascript"></script>'.PHP_EOL;
}
# fclose($myfile) ;
if (isset($metajson["assets"][$app_version]["php"])) {
$app_php = $metajson["assets"][$app_version]["php"] ;
foreach ($app_php as $php_file) {
include_once($php_file) ;
}
}
echo '<link rel="icon" type="image/x-icon" href="'.$app_root_url.'/assets/img/fav.ico">' ;
?>
© Copyright notes
The copyright of the article belongs to the author, please do not reprint without permission.
Related posts
No comments...