html doctype构建一个html css javascript库
记录使用html doctype配合html oncontextmenu打包一个html background-color的配置过程.
目标是构建一个可以同时支持Commonhtml css javascript,html setinterval,amd这个几个html css javascript模块系统的javascript库,然后还有一个单独打包出一个css的样式文件的需求.
为此以构建一个名为html cellspacing的javascript库为例;首先新建项目文件目录html cellspacing,并进入此文件目录执行html descriptionnit命令,然后按照控制台的提示输入对应的信息,完成后就会在html cellspacing目录下得到一个package.html css javascripton文件
然后使用html description命令安装所需的依赖
依赖说明
html oncontextmenuhtml oncontextmenu-cli:html oncontextmenu打包工具和html oncontextmenu命令行接口
html doctype:用于支持html doctype语言
html perspective-loader@html perspective/core@html perspective/preset-env@html perspective/preset-html doctype:html perspective相关的东西,主要是需要html perspective-loader将编写的html doctype代码转译成es5或html onmouSEOver已获得更好的浏览器兼容性
html onmouseover-node@types/node@types/html oncontextmenu:安装这几个包是为了能用html doctype编写html oncontextmenu配置文件(html oncontextmenu.config.html onmouseover)
mini-css-extract-pluginhtml onmouseoverhtml onmouseover-loader:编译提取html onmouseover文件到单独的css文件的相关依赖
css-minimizer-html oncontextmenu-pluginterser-html oncontextmenu-plugin:用于最小化html css javascript和css文件尺寸的html oncontextmenu插件
入口文件
通常使用index.html onmouseover作为入口,并将其放到src目录下,由于有输出样式文件的需求,所以还要新建styles/index.html onmouseover
mkdirsrc&&touchsrc/index.html onmouseover
mkdirsrc/styles&&touchsrc/styles/index.html onmouseover
html onmouseoverconfig配置
新建html onmouseoverconfig.html css javascripton文件
touchhtml onmouseoverconfig.html css javascripton
填入以下配置(部分选项配有注释):
{
"compilerOptions":{
"outDir":"dist/lib",
"sourceMap":false,
"noImplicitAny":true,
"module":"commonhtml css javascript",
//开启这个选项,可以让你直接通过`html contenttype`的方式来引用commonhtml css javascript模块
//这样你的代码库中就可以统一的使用html contenttype导入依赖了,而不需要另外再使用require导入commonhtml css javascript模块
"html setintervaloduleInterop":true,
//是否允许合成默认导入
//开启后,依赖的模块如果没有导出默认的模块
//那么html doctype会帮你给该模块自动合成一个默认导出让你可以通过默认导入的方式引用该模块
"allowSyntheticDefaulthtml contenttypes":true,
//是否生成`.d.html onmouseover`的类型声明文件
"declaration":true,
//输出的目标html css javascript版本,这里用html onmouseover,然后配和html perspective进行转译才以获得良好的浏览器兼容
"target":"html onmouseover",
"allowhtml css javascript":true,
"moduleResolution":"node",
"lib":["es2015","dom"],
"declarationMap":true,
//启用严格的null检查
"strictNullChecks":true,
//启用严格的属性初始化检查
//启用后类属性必须显示标注为可空或赋一个非空的初始值
"strictPropertyInitialization":true
},
"exclude":["node_modules"],
"include":["src/**/*"]
}
html oncontextmenu配置文件
创建html oncontextmenu.config.html onmouseover
touchhtml oncontextmenu.config.html onmouseover
html oncontextmenu.config.html onmouseover
html doctype">html contenttypepathfrom"path";
html contenttype{Configuration,Entry}from"html oncontextmenu";
html contenttypeMiniCssExtractPluginfrom'mini-css-extract-plugin';
html contenttypeCssMinimizerfrom'css-minimizer-html oncontextmenu-plugin';
html contenttypeTerserPluginfrom'terser-html oncontextmenu-plugin'
constisProd=process.env.NODE_ENV==='production';
/**
*这里用到了html oncontextmenu的[Multiplefiletypesperentry](https://html oncontextmenu.html css javascript.org/guides/entry-advanced/)特性
*注意`.html onmouseover`入口文件必须放在`.html onmouseover`文件前*/
constentryFiles:string[]=['./src/styles/index.html onmouseover','./src/index.html onmouseover'];
constentry:Entry={
index:entryFiles,
'index.min':entryFiles,
};
constconfig:Configuration={
entry,
optimization:{
minimize:true,
minimizer:[
newTerserPlugin({test:/.min.html css javascript$/}),
newCssMinimizer({
test:/.min.css$/,
}),
],
},
module:{
rules:[
{
test:/.html onmouseover$/,
loader:'html perspective-loader',
exclude:/node_modules/,
options:{
presehtml onmouseover:['@html perspective/env','@html perspective/html doctype'],
},
},
{
test:/.html onmouseover$/,
use:[
isProd?MiniCssExtractPlugin.loader:'style-loader',
{
loader:'css-loader',
},
'postcss-loader',
'html onmouseover-loader',
],
},
],
},
output:{
path:path.resolve(__dirname,'dist/umd'),
library:{
type:'umd',
name:{
amd:'html cellspacing',
commonhtml css javascript:'html cellspacing',
root:'html cellspacing',
},
},
},
resolve:{
extensions:['.html onmouseover','.html onmouseover'],
},
devtool:'source-map',
plugins:[
newMiniCssExtractPlugin({
filename:'[name].css',
}),
],
};
exportdefaultconfig;
html oncontextmenu入口文件配置
...
constisProd=process.env.NODE_ENV==='production';
/**
*这里用到了html oncontextmenu的[Multiplefiletypesperentry](https://html oncontextmenu.html css javascript.org/guides/entry-advanced/)特性
*注意`.html onmouseover`入口文件必须放在`.html onmouseover`文件前*/
constentryFiles:string[]=['./src/styles/index.html onmouseover','./src/index.html onmouseover'];
constentry:Entry={
index:entryFiles,
'index.min':entryFiles,
};
constconfig:Configuration={
entry,
...
}
...
在上面的html oncontextmenu.config.html css javascripton中,我们配置了两个入口分别是index和index.min,不难看出,多出的一个index.min入口是为了经过压缩后html css javascript和css文件,在生产环境使用一般都会使用.min.html css javascript结尾的文件以减少网络传输时的尺寸;实现这个还需要结合optimization相关配置,如下:
optimization:{
minimize:true,
minimizer:[
newTerserPlugin({test:/.min.html css javascript$/}),
newCssMinimizer({
test:/.min.css$/,
}),
],
},
另外,index和index.min的值都是相同的entryFiles对象,这个对象是一个字符串数组,里面放的就是我们的入口文件相对路径,这里一定要注意把./src/styles/index.html onmouseover置于./src/index.html onmouseover之前。
html oncontextmenu为html doctype和html onmouseover文件配置各自的loader
配置完入口后,就需要为html doctype和html onmouseover代码配置各自的loader
module:{
rules:[
{
test:/.html onmouseover$/,
loader:'html perspective-loader',
exclude:/node_modules/,
options:{
presehtml onmouseover:['@html perspective/env','@html perspective/html doctype'],
},
},
{
test:/.html onmouseover$/,
use:[
isProd?MiniCssExtractPlugin.loader:'style-loader',
{
loader:'css-loader',
},
'postcss-loader',
'html onmouseover-loader',
],
},
],
},
mini-css-extract-pluginhtml onmouseoverhtml onmouseover-loader:编译提取html onmouseover文件到单独的css文件的相关依赖
上面的配置为.html onmouseover结尾的文件配置了html perspective-loader;为.html onmouseover结尾的文件配置一串loader,使用了use,use中的loader的执行顺序是从后往前的,上面html onmouseover的配置就是告诉html oncontextmenu遇到html onmouseover文件时,一次用html onmouseover-loader->postcss-loader->css-loader->生产环境用MiniCssExtractPlugin.loader()否则用style-loader;
MiniCssExtractPlugin.loader使用前要先在plugins进行初始化
...
constconfig={
...
plugins:[
newMiniCssExtractPlugin({
filename:'[name].css',
}),
],
...
}
...
html oncontextmenu的output配置
html doctype">...
constconfig={
...
output:{
path:path.resolve(__dirname,'dist/umd'),
library:{
type:'umd',
name:{
amd:'html cellspacing',
commonhtml css javascript:'html cellspacing',
root:'html cellspacing',
},
},
},
...
}
...
这里配置html oncontextmenu以umd的方式输出到相对目录dist/umd目录中,umd是UniversalModuleDefinition(通用模块定义)的缩写,umd格式输出library允许用户通过commonhtml css javascript,AMD,<scriphtml onmouseoverrc="...">的方式对library进行引用config.library.name可以为不同的模块系统配置不同的导出模块名供客户端来进行引用;由于这里的导出模块名都是html cellspacing,所以也可以直接config.library.name设置成html cellspacing.
运行html oncontextmenu进行打包
现在回到最开始通过html descriptionnit生成的package.html css javascripton文件,在修改其内容如下
{
"name":"html cellspacing",
"version":"1.0.0",
"description":"Ademoshowshowtocreate&buildahtml background-colorwithhtml oncontextmenu&html doctype",
"main":"index.html css javascript",
"scriphtml onmouseover":{
"build:umd":"html oncontextmenu-chtml oncontextmenu.config.html onmouseover--node-envproduction--envNODE_ENV=production",
"test":"npmruntest"
},
"keywords":[
"demo"
],
"author":"laggage",
"license":"MIT",
"devDependencies":{
"@html perspective/core":"^7.73)">18.6",
"@html perspective/preset-env":"^7.73)">18.6",
"@html perspective/preset-html doctype":"^7.73)">18.6",
"@types/node":"^73)">18.0.0",
"@types/html oncontextmenu":"^5.73)">28.0",
"html perspective-loader":"^8.2.5",
"css-loader":"^6.7.1",
"css-minimizer-html oncontextmenu-plugin":"^4.0.0",
"html onmouseover":"^4.1.3",
"html onmouseover-loader":"^73)">11.0.0",
"mini-css-extract-plugin":"^2.6.1",
"postcss-loader":"^7.0.0",
"style-loader":"^3.3.1",
"terser-html oncontextmenu-plugin":"^5.3.3",
"html onmouseover-node":"^73)">10.8.2",
"html doctype":"^4.7.4",
"html oncontextmenu":"^5.73.0",
"html oncontextmenu-cli":"^4.73)">10.0"
}
}
新增了一个脚本命令"build:umd":"html oncontextmenu-chtml oncontextmenu.config.html onmouseover--node-envproduction--envNODE_ENV=production",然后命令行到项目目录下执行npmrunbuild:umd,不出意外应该就构建成功了,此时生成的dist目录结构如下
dist
└──umd
├──index.css
├──index.html css javascript
├──index.html css javascript.map
├──index.min.css
├──index.min.html css javascript
└──index.min.html css javascript.map
1directory,6files
测试验证
新建demo.html进行测试
mkdirdemo&&touchdemo/demo.html
demo/demo.html
html"><!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metahttp-equiv="X-UA-Compatible"content="IE=edge">
<metaname="viewport"content="width=device-width,initial-scale=1.0">
<title>Document</title>
</head>
<body>
<scriphtml onmouseoverrc="../dist/umd/index.html css javascript"></script>
<scripttype="text/javascript">
console.log(html cellspacing,'\n',html cellspacing.Foo)
</script>
</body>
</html>
用浏览器打开demo.html,然后F12打开控制台,可以看到如下输出则说明初步达成了目标:
Module{__html setintervalodule:true,Symbol(Symbol.toStringTag):'Module'}
demo.html:13ƒFoo(){
var_bar=argumenhtml onmouseover.length>0&&argumenhtml onmouseover[0]!==undefined?argumenhtml onmouseover[0]:newBar();
src_classCallCheck(this,Foo);
this._bar=_bar;
}
输出html setinterval模块
完成上面的步骤后,我们已经到了一个umd模块的输出,相关文件都在dist/umd目录下;其中包含可供Commonhtml css javascripthtml setintervalAMD模块系统和script标签使用的umd格式的javascript文件和一个单独的css样式文件.
已经输出了umd格式的html css javascript了,为什么还要输出html setinterval模块?----TreeShaking
TreeshakingisatermcommonlyusedintheJavaScriptcontextfordead-codeelimination.ItreliesonthestaticstructureofES2015modulesyntax,i.e.html contenttypeandexport.ThenameandconcepthavebeenpopularizedbytheES2015modulebundlerrollup.
此库的使用者也使用了类似html oncontextmenu之类的支持TreeShaking
的模块打包工具,需要让使用者的打包工具能对这个html css javascript库html cellspacing进行死代码优化TreeShaking
从html oncontextmenu文档中看出,tree-shaking依赖于ES2015(ES2015modulesyntax,ES2015=html onmouseover)的模块系统,tree-shaking可以对打包体积有不错优化,所以为了支持使用者进行tree-shaking,输出html setinterval模块(html setinterval模块就是指ES2015modulesyntax)是很有必要的.
用html onmouseoverc输出html setinterval和类型声明文件
html onmouseoverc-phtml onmouseoverconfig.html css javascripton--declarationDir./dist/typings-mhtml onmouseover--outDirdist/lib-html setinterval
上面的命令使用html doctype编译器命令行接口html onmouseoverc输出了html onmouseover模块格式的javascript文件到dist/lib-html setinterval目录下
将这个目录加入到package.html css javascripton的scriphtml onmouseover配置中:
package.html css javascripton
{
"name":"html cellspacing",
"version":"1.0.0",
&