# load-projectjs
**Repository Path**: mirrors_singod/load-projectjs
## Basic Information
- **Project Name**: load-projectjs
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-25
- **Last Updated**: 2026-06-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 初衷
项目地址: [projectM](https://github.com/linfenpan/projectjs)
测试地址: [demo](http://linfenpan.github.io/demo/project/)
因流行的模块加载器,或用法不够简单、大小超出预期等原因,不能很好的满足日常开发,为此,模仿编写了此项目。
如要使用或测试,请用最新版
功能介绍:
1. require 进行模块加载
2. define 进行模块定义
注1: require 作为关键字,不可被压缩、更改名字
可能有个疑惑,既然已经有require.js和sea.js,还需要这玩意干嘛呢?
1. 体积更小
2. 更少潜规则
3. 更直白的配置
4. 更少的关键字,尽可能保证各处使用的一致性
5. 以后缀区分文件类型,可自定义后缀载入方式,扩展更丰富的功能
6. 同样兼容PC[包括IE]和移动端
举个最直观的例子:
有如下文件:
``` javascript
// ./user/user.js
define("user", function(require, exports, module){
exports.data = require("./data.js");
});
```
如果使用 sea.js 引入:
``` javasript
seajs.use("./user/user", function(){
seajs.use("user", function(user){
// 其中的 require("./data.js") 将会寻找 ./data.js
console.log(user);
});
});
```
如果使用 project.js 引入:
``` javascript
require("./user/user.js", function(){
require("user", function(user){
// 其中的 require("./data.js") 将会寻找 ./user/data.js
console.log(user);
});
});
```
好处是显而易见的,define的时候,再也不会被路径,搞得一头雾水了。
缺点也有:
1. 没有完善脚本的打包规则
2. 仅且适用于浏览器,其余的设备,因木有接触,不做更多兼容
3. 因团队各种奇怪的玩法,表示节操君已经掉了一地
4. 维护团队么...... [只有一头熊
# 简单用例
引入 project.js,项目的基本路径,默认是当前网址的目录。
如页面地址为: http://www.test.com/xxx/index.html
那项目路径,则是: http://www.test.com/xxx/
``` html
```
而对于 user.js 的定义:
``` javascript
// 不完全遵循 cmd 规范,最多接受两个参数,1、板块名字[可缺省] 2、函数
define(function(require, exports, module){
exports.name = "da宗熊";
exports.email = "xxx@qq.com";
});
```
# define
用于定义模块,其使用遵循此格式: define([moduleName,] content);
其中,moduleName 可忽略。
如:
``` javascript
define(function(require, exports, module){
/** 其中,如果用不到require、exports、module,在声明中可去掉 **/
});
// or
define("也可以是非function的任意内容");
```
moduleName的默认值,将会是此脚本的路径。
在 define 中,用到的require函数,将会基于当前 脚本目录 进行寻址。
有 http://www.test.com/script/test.js
``` javascript
define(function(require){
var data1 = require("./data.js"); // 将会同步加载 http://www.test.com/script/data.js
require("./data2.js", function(){ /* data2.js 会异步加载 */ });
});
```
如显式指定了 moduleName,而第二参数是函数,那么,也会进行模块加载,如:
``` javascript
define("moduleA", function(require){
var user = require("./user.js"); // 根据当前文件所在位置,获取到 user.js
});
```
如果 define 写在页面的内联脚本中,其中的 require 寻址路径,与初始[配置]寻址路径保持一致。
``` html
http://www.test.com/index.html
```
这里的 require("authorText.js") 对应 http://www.test.com/authorText.js 。
如果,有配置路径:
``` html
```
则 require("authorText.js") 对应是 http://www.test.com/script/authorText.js
也可以通过第3个参数[必须是3个参数],设置 define 中的寻址路径,用于应对异步 define 之类的需求。
异步设置 define,默认的寻址路径,都是 项目的寻址路径。
``` javascript
define("moduleA", function(require){
// require 寻址文件,将从 http://www.test.com/ 开始寻找
}, "http://www.test.com/");
```
注意: 第3个参数,如果是 "//",则代表当前项目的初始寻址路径。
如项目的寻址路径为: http://www.test.com/script/,那么:
``` javascript
define("moduleA", function(require){
// http://www.test.com/data/data.js
require("./data.js");
}, "//../data");
```
# require
用于加载一个或多个模块。用法如下: require(module1, [module2, module3, ...], callback?);
其中,callback 可以省略。
对于没加载过的板块,require是异步加载;已载入模块,则是同步返回内容。
而在模块中,require("moduleA") 这种形式的代码,可“当作” 100% 的同步加载。
``` javascript
define(function(require){
// 此行代码,将会同步返回 user.js 中,设置的 exports 的内容
// 实际上,在运行 define(function(){}) 时,user.js的代码,就已经被运行了
var user = require("user.js");
});
```
如果 require 最后,跟着callback,而且模块没有加载过,那么模块将会异步加载,完成后,调用 callback
见如下代码:
``` javascript
```
在 require 中,有几个实用的工具方法:
1. require.url("./data.json"); 根据模块路径,返回文件路径
2. require.loadScript(url); 加载脚本
3. require.addExtension("拓展名字", "拓展内容"); 给 window.require 和 define 的 require,同时增加方法
同时,也可在 require.loader 中,对后缀进行拓展:
``` javascript
require.loader.add("txt", function(url, callback){
$.get(url, function(text){
callback("加载文件:" + text);
});
});
require("./test.txt", function(text){
// text === "加载文件:xxxxx";
});
```
所有loader,可通过"!"注释,表明该文件的正确加载方式,如:
``` javascript
require("./test.html!js", $.noop);
```
``` test.html ``` 将会以 js 形式,进行加载。
注:默认的loader,只有 js,在 full 版中,有 js、css、ajax、json 4个loader。
也可以通过 ``` require.loader.setDefault("ajax") ``` 来更改默认的 loader,路径的后缀名,如果不存在于 loader列表,则会使用默认的 loader,进行加载
# 寻址路径
寻址路径,默认是当前访问地址的根目录。可通过设置 id="seedNode",来指定根据 project.js 所在目录作为基础路径。
``` html
```
板块的寻址路径,将会是: http://www.test.com/js/
也可以通过配置,进行配置:
``` javascript
require.config({ basePath: "http://www.test.com/script/" });
```
如果 basePath 是绝对路径,则使用 basePath 作为 寻址路径。
如果 basePath 是相对路径,则:
1. 不存在 seedNode ⇒ 页面访问路径 + 相对路径 = 寻址路径
2. 存在 seedNode ⇒ project.js所在的目录 + 相对路径 = 寻址路径
# 模板
通过 require.config({ template: {} }); 配置路径模板,如:
``` javascript
require.config({
template: {
stat: "./wap/stat.js"
}
});
require("{stat}"); // 将加载 ./wap/stat.js
```
主要针对脚本打指纹之后的寻址。
# 别名
通过 require.config({ alias: {} }); 进行别名制定,特别针对非模块化的脚本,会特别有用,如:
```
require.config({
alias: {
"jquery": window.jQuery
}
});
require("jquery", function($){
// $ -> window.jQuery
});
```
# FULL版
full版,相对与普通版本,额外增加了 3 个 loader:
1. ajax loader,可进行ajax请求
2. json loader,可进行ajax请求,并将内容转为 json [基于 ajax loader 开发]
3. css loader,可进行css加载
同时,拓展了 require 两个方法:
1. require.ajax,可用于 ajax 请求
2. require.css,可用于 css 加载
注: 两个方法,通过 require.addExtension("xxx", func); 的形式,进行注入
# 注意事项
1、不能异步使用 define 函数,如:
``` javascript
$(function(){
// 因为 dom ready 有一定的时差
define("main", function(require){
// require 的寻址路径,可能会混乱【不一定会发生
});
});
```
2、css loader,link标签,是append到 head 元素中。
重写css loader加载进来的样式时,需要注意
3、define("moduleA", fn);
# 结语
持续优化中,如有BUG,联系 [da宗熊] 1071093121@qq.com