- 微前端插件 v-micro-app-plugin
小白探索世界欧耶!~
微前端实践总结前端微前端笔记经验分享学习插件项目总结
v-micro-app-plugin是一款基于京东MicroApp框架的微前端插件,旨在帮助开发者快速地将微应用集成到不同的系统中,实现高效、灵活的前端模块化开发。以下是详细的使用指南,帮助你快速上手。微前端插件v-micro-app-plugin源码地址:GitHub-yoguoer/v-micro-app-plugin:v-micro-app-plugin是一款基于MicroApp的微前端插件
- [vue源码01] data响应式 和 初始化渲染
woow_wu7
导航[深入01]执行上下文[深入02]原型链[深入03]继承[深入04]事件循环[深入05]柯里化偏函数函数记忆[深入06]隐式转换和运算符[深入07]浏览器缓存机制(http缓存机制)[深入08]前端安全[深入09]深浅拷贝[深入10]DebounceThrottle[深入11]前端路由[深入12]前端模块化[深入13]观察者模式发布订阅模式双向数据绑定[深入14]canvas[深入15]web
- 前端代码整洁规范之道
前端fighter
前端
1.使用模块化开发前端模块化是指将前端代码划分为独立的模块,每个模块具有特定的功能和职责,并且可以独立开发、测试和维护。模块化的主要目的是提高代码的可维护性、可重用性和可扩展性。代码模块化的好处:提高代码的可维护性:模块化将代码分割成独立的模块,每个模块只关注自己的功能,易于理解和修改。提高代码的可重用性:模块化将代码划分为独立的功能模块,可以在不同的项目中复用。提高开发效率:模块化可以并行开发,
- Vue学习笔记5--前端工程化
UtilMan
前端工程化完整的基础篇笔记PDF下载,完全手打有用的话请给个赞呗Thanks♪(・ω・)ノ模块化相关规范概述传统开发问题命名冲突文件依赖模块化含义:把单独的一个功能封装到一个模块(文件)中,模块之间相互隔离,可以通过特定的接口公开内部成员,也可以依赖别的模块好处:方便代码重用,提升开发效率,方便后期维护浏览器端模块化规范AMD(Require.js)CMD(Sea.js)服务器端模块化规范Comm
- 常用的前端模块化标准总结
wen_文文
JavaScript前端
1、模块化标准出现以前使用的模块化方案:1)文件划分:将不同的模块定义在不同的文件中,然后使用时通过script标签引入这些文件缺点:模块变量相当于是定义在全局的,容易造成变量名冲突(即不同模块存在相同名称的变量);模块之间的依赖关系和加载顺序不好管理;如果模块之间存在依赖关系,则在引入文件时需要手动调整,否则会出现运行错误如果引入了多个模块,则无法清楚知道某个变量来自哪个模块,需要逐个模块进行排
- require 与 import 两种引入模块方式到底有什么区别?
八了个戒
前端JavaScript系列前端面试javascript前端模块化模块化规范import
关于JavaScript的模块化规范,可以移步至:【JavaScript高级】模块化规范「一文让你彻底搞懂前端模块化规范&区别」下面进入正题require与import两种引入模块方式,到底有什么区别呢?大致可以分为以下几个方面:一、写法上require/exports的用法:constpath=require('path')exports.path=pathmodule.exports=path
- 前端模块化-AMD、CMD、CommonJS和UMD、ESM
cherry_dty
前端模块化构建工具前端node.jsjavascript
前端模块化-AMD、CMD、CommonJS和UMD、ESM背景CommonJSAMD和require.jsCMD和sea.jsUMD(UniversalModuleDefinition-通用模块定义)ES6ModuleES6模块与CommonJS模块的差异总结背景在NodeJS之前,由于没有过于复杂的开发场景,前端是不存在模块化的,后端才有模块化。NodeJS诞生之后,它使用CommonJS的模
- 带你全面理解JS模块的标准(AMD、CMD、COMMON.JS 、 UMD、ESM)
春风得意之时
JavaScriptjavascript模块测试vue.jstypescript开发语言
在前端的世界演变里,有着几种JS的模块规范,从出现的顺序来说就是:①amd②cmd③common.js④umd⑤esm现在Vue框架里面都是遵守esm规范,不得不说esm是目前最好最流行的一种js规范了amd-浏览器中的js模块化解决方案AMD全称是AsyncModuleDefinition-中文:异步模块化定义require.js是AMD模块规范的一个具体实现核心是通过define方法对无序的代
- 什么是前端模块化,组件化,工程化?
SY
1.前端模块化:可以理解为一组自定义业务的抽象封装,是根据项目的情况来进行封装组合到一起的,比如我们可以分为登录模块,评论模块。模块可维护性好,组合灵活,方便调用,多人协作互不干扰。2.前端组件化:指对具体的某个功能的封装,比如所有的分页可以封装为分页组件来统一使用,以此来达到组件复用,提高开发效率。3.前段工程化:概念:指使用软件工程的技术和方法来进行前端项目的开发、维护和管理。前端工程化包含如
- [深入19] 手写Promise
woow_wu7
image导航[深入01]执行上下文[深入02]原型链[深入03]继承[深入04]事件循环[深入05]柯里化偏函数函数记忆[深入06]隐式转换和运算符[深入07]浏览器缓存机制(http缓存机制)[深入08]前端安全[深入09]深浅拷贝[深入10]DebounceThrottle[深入11]前端路由[深入12]前端模块化[深入13]观察者模式发布订阅模式双向数据绑定[深入14]canvas[深入1
- 【Vue】1-1、webpack的基本使用
QX_Java_Learner
Vuevue.jswebpack前端
一、什么是Webpack概念:webpack是前端项目工程化的具体解决方案。主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端JavaScript的兼容性、性能化等强大的功能。好处:让程序员把工作重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性。注意:目前Vue、React等前端项目基本上都是基于webpack进行工程化开发的。二、Demo步骤:1)新建项目空目
- 超详细!Vue-coderwhy个人学习笔记(三)(Day4-Day5)
coderYYY
Vue学习笔记Vuevue.js前端es6
前言接之前文章超详细!Vue-coderwhy个人学习笔记(一)(Day1-Day2)超详细!Vue-coderwhy个人学习笔记(二)(Day3)主要内容:前端模块化、webpack五、前端模块化(一)、为什么需要模块化?1.JavaScript原始功能在网页开发的早期,js制作作为一种脚本语言,做一些简单的表单验证或动画实现等,那个时候代码还是很少的。那个时候的代码是怎么写的呢?直接将代码写在
- Vue学习笔记——前端模块化
小910888
视频资源来自:b站coderwhy王红元老师——最全最新Vue、Vuejs教程,从入门到精通文件仅为个人观看视频后的学习心得笔记,用于个人查看和记录保存。文中定有疏漏错误之处,恳请指正。本节目录:为什么需要模块化前端模块化为什么需要模块化JavaScript原始功能js文件太多,可能造成变量冲突。加载的顺序不同,可能造成覆盖匿名函数的解决方案使用闭包,把函数括起来(function(){varna
- vue2.0学习笔记黑马
firewrk
学习笔记vue
前置知识一、WebPack实际开发中并不需要手动配置webpack1、概念webpack是前端项目工程化的具体解决方案主要功能:提供了友好的前端模块化开发支持、以及代码压缩混淆、处理浏览器端javaScript的兼容性、性能优化等强大的功能好处:提高开发效率和项目可维护性2、创建webpack项目新建项目空目录需要英文路径,并允许npminit-y命令,初始化包管理配置文件package.json
- require.js理解
GJWeigege
JavaScript模块化异步javascript框架
前言实习过程学习了require.js的相关内容,也在网上查阅了一部分资料,相比于其他框架,require.js更为简单易学,也更容易使用。下面我就简单介绍我所认识的require.js,希望大家能够多多指教!Require.js的优缺点优点:正如我前面所提到的,require.js框架相对较小而且相对简单使代码模块化异步加载js文件,防止请求阻塞代码模块化能够使代码称为一个个相对独立的模块,在创
- requirejs 配置 requirejs.config 引用css
Amy_yqh
requirejs.config基本配置我们在使用require.js的时候,需要配置一些默认的路径,方便后面的文件的引用requirejs.config({baseUrl:'js/lib',//参照于引入这个js文件的index.html页面的相对路径,因为此时mian.js文件已经导入到了index.html中map:{'*':{'css':'require/css.min'//require
- 前端模块化-CommonJS、CMD、AMD、UMD和ESM
WEB前端含光
在NodeJS之前,由于没有过于复杂的开发场景,前端是不存在模块化的,后端才有模块化。NodeJS诞生之后,它使用CommonJS的模块化规范。从此,js模块化开始快速发展。模块化的开发方式可以提供代码复用率,方便进行代码的管理。通常来说,一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数。CommonJSNodeJS是CommonJS规范的主要实践者,它有四个重要的环境变量为模块化
- [部署03] gitlab-CI
woow_wu7
导航[深入01]执行上下文[深入02]原型链[深入03]继承[深入04]事件循环[深入05]柯里化偏函数函数记忆[深入06]隐式转换和运算符[深入07]浏览器缓存机制(http缓存机制)[深入08]前端安全[深入09]深浅拷贝[深入10]DebounceThrottle[深入11]前端路由[深入12]前端模块化[深入13]观察者模式发布订阅模式双向数据绑定[深入14]canvas[深入15]web
- 2020-09-05 前端模块化以及commonJS与ES6模块化
大海我杰哥
在计算机程序开发中,开发一个项目往往需要大量的代码,如果把这些代码都放在一个文件中太多太多,维护起来太困难。我们根据功能和方法的把代码放在不同的文件中这样每个文件包含的代码就相对较少。(一个js文件就是一个模块)这就是模块化。模块化后的优点:一、提到代码的可维护性,二、提高代码的复用性,三、避免代码污染模块化之后每个js文件都有自己的作用域,就是说每个js文件都是私有的要用的话要遵循一定的规则:c
- 前端模块化
取个帅气的名字真好
模块的定义模块就是实现特定功能的相互独立的一组方法。对象varmyModule={f1:function(){console.log('f1')this.f2()},f2:function(){console.log('f2')},f3:1}//调用myModule.f1()//修改myModule.f3=4//输出//f1//f2优点:把所有的模块成员封装在一个对象中,避免了变量污染,只要保证模
- 简单聊聊 webpack vue-cli vite
奶爸程序猿
先说说webpack从本质上来讲,webpack是一个现代的JavaScript应用的静态模块打包工具,其实重点就是跟,他依赖于node模块前端模块化是指:前端的js,css,图片,json文件,还有一些其他的静态资源可以当成模块来进行使用,还有就是处理模块之前的依赖,比如scss转css(sass-loader,同时sass-loader依赖node-sass),es6转es5,typescri
- 前端模块化
喜欢唱Hi歌的
在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀,这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说
- 前端模块化之CommonJS与ES6模块化
Shaelyn_
为什么要使用前端模块化?减少代码污染.数据更安全,防止外部修改.提高可维护性.什么是前端模块化?将大工程代码拆分,分成多个模块,按需引入使用.以下浅谈常用的CommonJS与ES6模块化ES6模块化首先nodejs以及浏览器默认是不支持es6模块化的先来看下在浏览器环境下es6模块化的一个案例:创建三个文件,index.html页面,index.js页面对应的js文件,module.js是页面js
- 模块化发展历程
丐中丐
模块化主要用来抽离公共代码,隔离作用域,避免变量冲突。。。llFE(立即调用函数表达式)使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突(function(){return{data:[]}})()AMD使用requireJS来编写模块化,特点:依赖必须提前声明好//在html引入require.js//script里有个data-main属性,require.js
- [vue源码04] Vue.set 和 vm.$set ( Vue.delete 和 Vm.$delete )
woow_wu7
导航[深入01]执行上下文[深入02]原型链[深入03]继承[深入04]事件循环[深入05]柯里化偏函数函数记忆[深入06]隐式转换和运算符[深入07]浏览器缓存机制(http缓存机制)[深入08]前端安全[深入09]深浅拷贝[深入10]DebounceThrottle[深入11]前端路由[深入12]前端模块化[深入13]观察者模式发布订阅模式双向数据绑定[深入14]canvas[深入15]web
- ES6模块化(module)简介
小棋子js
前言JavaScript在es6加入了模块(module)体系的语法,在此之前我们编写代码时必须依靠require.js之类的工具来实现模块化加载。其实模块化的概念在其他语言中很常见,比如python/java里的import导入包,正好es6里也是用import关键字。es6的模块化使用import/export关键字来实现模块的导入和导出,并且自动采取严格模式(无论是否代码顶部是否标注了"us
- 【Webapck学习】
呐呐呐呐。
学习webpack前端
1、webpack是什么Webpack是一个前端模块化方案,更侧重于模块打包。我们可以把开发中的所有资源(图片,js,css,字体等)都看成模块,通过loader和plugins对资源进行处理,打包成符合生产环境部署的前端资源初始化项目,得到package.json文件npminit-y安装webpack,webpack-clinpminstallwebpackwebpack-cli使用websp
- JS模块化规范之AMD
阿布爱可乐
前端javascript前端开发语言
JS模块化规范之AMD模块规范AMD(AsynchronousModuleDefinition)概念基本语法AMD实现未使用AMD规范使用require.js总结模块规范AMD(AsynchronousModuleDefinition)概念AsynchronousModuleDefintionCommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载
- JavaScript模块化规范
智慧源于勤奋
1、无规范一个文件一个模块,缺点污染全局作用域。2、CommonJSNode,Webpack支持一个文件一个模块,模块变量不污染全局变量。通过require来同步加载所依赖模块。通过exports或者module.export导出需要暴露的接口。服务器端从本地磁盘加载文件,同步加载没有问题,但同步加载不适合浏览器。3、AMD非同步加载,允许回调函数。require.js实现了AMD规范。两个API
- 一文带你了解,前端模块化那些事儿
一个爱编程的男孩
笔记前端javascript
文章目录前端模块化省流:chatGPT总结一、参考资料二、发展历史1.无模块化引出的问题:横向拓展2.IIFE3.Commonjs(cjs)4.AMD引出的问题:5.CMD6.UMD7.ESM往期精彩文章前端模块化省流:chatGPT总结该文章主要讲述了前端模块化的发展历史和各个阶段的技术方案,包括无模块化(IIFE)、CommonJS、AMD、CMD、ESModule、UMD。其中,无模块化时期
- java杨辉三角
3213213333332132
java基础
package com.algorithm;
/**
* @Description 杨辉三角
* @author FuJianyong
* 2015-1-22上午10:10:59
*/
public class YangHui {
public static void main(String[] args) {
//初始化二维数组长度
int[][] y
- 《大话重构》之大布局的辛酸历史
白糖_
重构
《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。
背景
公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中
- 电驴链接在线视频播放源码
dubinwei
源码电驴播放器视频ed2k
本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网:
http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。
项目源码:
http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。
项目源码依赖于两个库项目,库项目一链接:
http://git.oschina.
- Javascript中函数的toString()方法
周凡杨
JavaScriptjstoStringfunctionobject
简述
The toString() method returns a string representing the source code of the function.
简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。
句法
function.
- struts处理自定义异常
g21121
struts
很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。
非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。
此处我们用的是非运行时异常,首先定义一个异常LoginException:
/**
* 类描述:登录相
- Linux中find常见用法示例
510888780
linux
Linux中find常见用法示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
- SpringMVC的各种参数绑定方式
Harry642
springMVC绑定表单
1. 基本数据类型(以int为例,其他类似):
Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
}
表单代码:
<form action="saysth.do" method="post&q
- Java 获取Oracle ROWID
aijuans
javaoracle
A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row.
The oracle.sql.ROWID class i
- java获取方法的参数名
antlove
javajdkparametermethodreflect
reflect.ClassInformationUtil.java
package reflect;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAtt
- JAVA正则表达式匹配 查找 替换 提取操作
百合不是茶
java正则表达式替换提取查找
正则表达式的查找;主要是用到String类中的split();
String str;
str.split();方法中传入按照什么规则截取,返回一个String数组
常见的截取规则:
str.split("\\.")按照.来截取
str.
- Java中equals()与hashCode()方法详解
bijian1013
javasetequals()hashCode()
一.equals()方法详解
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I
- 精通Oracle10编程SQL(4)使用SQL语句
bijian1013
oracle数据库plsql
--工资级别表
create table SALGRADE
(
GRADE NUMBER(10),
LOSAL NUMBER(10,2),
HISAL NUMBER(10,2)
)
insert into SALGRADE values(1,0,100);
insert into SALGRADE values(2,100,200);
inser
- 【Nginx二】Nginx作为静态文件HTTP服务器
bit1129
HTTP服务器
Nginx作为静态文件HTTP服务器
在本地系统中创建/data/www目录,存放html文件(包括index.html)
创建/data/images目录,存放imags图片
在主配置文件中添加http指令
http {
server {
listen 80;
server_name
- kafka获得最新partition offset
blackproof
kafkapartitionoffset最新
kafka获得partition下标,需要用到kafka的simpleconsumer
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.
- centos 7安装docker两种方式
ronin47
第一种是采用yum 方式
yum install -y docker
 
- java-60-在O(1)时间删除链表结点
bylijinnan
java
public class DeleteNode_O1_Time {
/**
* Q 60 在O(1)时间删除链表结点
* 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点
*
* Assume the list is:
* head->...->nodeToDelete->mNode->nNode->..
- nginx利用proxy_cache来缓存文件
cfyme
cache
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for ma
- [JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题
comsci
嵌入式
假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:
string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"
定义一个0整数c,然后用这个整数c去
- 如何集成支付宝官方文档
dai_lm
android
官方文档下载地址
https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash
集成的必要条件
1. 需要有自己的Server接收支付宝的消息
2. 需要先制作app,然后提交支付宝审核,通过后才能集成
调试的时候估计会真的扣款,请注意
- 应该在什么时候使用Hadoop
datamachine
hadoop
原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html
存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。
--------------------------------------------万能的分割线--------------------------------
有人问我,“你在大数据和Hado
- 在GridView中对于有外键的字段使用关联模型进行搜索和排序
dcj3sjt126com
yii
在GridView中使用关联模型进行搜索和排序
首先我们有两个模型它们直接有关联:
class Author extends CActiveRecord {
...
}
class Post extends CActiveRecord {
...
function relations() {
return array(
'
- 使用NSString 的格式化大全
dcj3sjt126com
Objective-C
格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c
- 使用activeX插件对象object滚动有重影
蕃薯耀
activeX插件滚动有重影
使用activeX插件对象object滚动有重影 <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#
- SpringMVC4零配置
hanqunfeng
springmvc4
基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。
项目说明如下:
1.db.sql是项目中用到的表,数据库使用的是oracle11g
2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动;
3.默认项目为零配置启动,如果需要更改启动方式,请
- 《开源框架那点事儿16》:缓存相关代码的演变
j2eetop
开源框架
问题引入
上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。
该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。
当然去看相关实现代代码的时候,大致是下面的样子。
[java]
view plain
copy
print
?
public vo
- AngularJS浅析
kvhur
JavaScript
概念
AngularJS is a structural framework for dynamic web apps.
了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm
Directive
扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间
- 架构师之jdk的bug排查(一)---------------split的点号陷阱
nannan408
split
1.前言.
jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.ou
- 如何对10亿数据量级的mongoDB作高效的全表扫描
quentinXXZ
mongodb
本文链接:
http://quentinXXZ.iteye.com/blog/2149440
一、正常情况下,不应该有这种需求
首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。
说一下,
- C语言算法之水仙花数
qiufeihu
c算法
/**
* 水仙花数
*/
#include <stdio.h>
#define N 10
int main()
{
int x,y,z;
for(x=1;x<=N;x++)
for(y=0;y<=N;y++)
for(z=0;z<=N;z++)
if(x*100+y*10+z == x*x*x
- JSP指令
wyzuomumu
jsp
jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %>
常用的三种指令: page,include,taglib
page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%>
include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include