vite搭建项目,vite 前端
本文主要介绍vite建设项目,支持微前端。通过示例代码详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。
目录
基本配置支持微前端构造。其他注释1。对旧浏览器的支持。关于TypeScript 3的注释。对接CDN4。构造错误4.1找不到包4.2请求超时4.3导入模块错误。得益于esbuild的超高性能,vite从诞生之日起就备受关注,一直保持着活跃的开发迭代。到目前为止,vite已经迭代到2.7.10版本,各方面已经基本具备了生产使用的条件。这段时间我在项目中尝试使用vite进行包构建,本文就是这个构建过程的记录。
基础配置
首先,使用vite的官方脚手架生成项目。
纱线创建vite vite-演示-模板反应-ts
上面的命令使用react-ts模板创建一个名为vite-demo的项目。因为我的团队使用react和typescript进行日常开发,所以我选择react-ts作为模板。vite官方支持的模板有很多,可以在create-vite中查看。
项目初始化后,目录结构如下:
____index.html
____.被增加
____package.json
____tsconfig.json
____vite.config.ts
____src
____App.tsx
____main.tsx
____App.css
____index.css
____vite-env.d.ts
____logo.svg
____favicon.svg
其中,vite.config.ts包含以下内容:
从“vite”导入{ defineConfig }
从 @vitejs/plugin-react 导入react
//https://vitejs.dev/config/
导出默认定义配置({
插件:[react()]
})
可以看到官方的vite做了一个比较完整的打包,相比之前的版本,开发体验提升了不少。
按照说明,安装完依赖项,启动应用后,速度真的很快。现在让我们做一些基本的转换。
我平时写风格用的比较少,vite在支持方面做的很好。安装完依赖项后,我只需要在代码中直接引用xxx.less即可。对于一个成熟的开发人员来说,风格应该被引入范围,通常使用css模块。
安装较少的预处理器,
无纱线添加装置
然后修改vite.config.ts文件并添加css模块配置:
导出默认定义配置({
.
css: {
模块:{
Localconvention: camel case only ,//我们使用驼峰形式。
},
},
.
})
添加配置后,只需将原来的xxx.less改为xxx.module.less,与create-react-app相同。
这里推荐一个vscode插件clinyong.vscode-css-modules,可以实现编码时样式类名的智能提示。同时,点击样式类名可以跳转到定义样式的地方,非常好用。如果样式以破折号的形式命名,比如。xxx-container,您需要如下配置这个vscode插件
{
cssModules.camelCase: true
}
这样就可以实现写风格时用中间破折号形式,代码中用驼峰形式。
当我开发一个中后台项目时,我使用了antd和lodash。众所周知,这两个是按需加载的大用户。以前我们用babel-plugin-import来应对,vite生态里也有很多类似的方案。我选择了插件vite-plugin-imp并修改了vite.config.ts如下:
从“vite-plugin-imp”导入vitePluginImp
导出默认定义配置({
.
插件:[
.
vitePluginImp({
列表:[
{
libName: lodash ,
libDirectory:“”,
camel2DashComponentName: false,
},
{
libName: antd ,
样式(名称){
//少用
return ` antd/es/$ { name }/style/index . js `;
},
},
],
}),
],
css: {
.
预处理程序选项:{
减:{
javascriptEnabled: true,
},
},
},
});
Antd已经默认支持摇树,上面的配置最后只会处理样式的按需加载。Lodash不支持摇树。我们也可以使用ESM版本lodash-es,这样就可以不用vite-plugin-imp了。配置如下:
导出默认定义配置({
解决:{
别名:[{
找到:/^lodash$/,
替换:“lodash-es”,
}],
},
});
通常我们在开发前端项目的时候,需要一些代理来调用后端API接口。vite配置如下:
导出默认定义配置({
.
服务器:{
代理服务器:{
/api_path/: {
目标: http://xxx.server.domain.com/,
changeOrigin:真的,
},
},
},
});
代理的底层是基于http-proxy的,这里不做过多解释。
现在你可以愉快地开发代码了。
支持微前端构建
因为我们的中后台应用是由微前端(钱坤)管理的,所以上述配置打包后无法被钱坤认可。这里可以看出主要原因,需要做一些额外的处理。
我们知道,要用webpack构建微前端,需要添加以下三个配置项:
{
输出:{
库目标:“umd”,
库:` $ {应用程序名称}-[名称]`,
JSON function:` webpackjson p _ $ { APP _ NAME } `,
}
}
在vite中,通过将build.rollupOptions.format设置为umd可以直接设置UMD规范,但实际的构建结果却无法被钱坤识别,这可能与vite使用html entry有关。
另一种方式,我们将当前应用程序构建为库,输出为UMD规范,然后手动编写一个html文件来加载输出JS。
按如下方式修改配置:
导出默认定义配置({
.
构建:{
lib: {
姓名,
entry: path.resolve(__dirname, src/index.tsx ),
格式:[umd],
},
},
.
})
配置完成后,执行纱线构建,提示以下错误:
代码拆分生成不支持UMD和生命输出格式。
因为我们的应用程序中有路由,所以我们使用按需加载。让我们打开rollup的inlineDynamicImports配置:
导出默认定义配置({
.
构建:{
汇总选项:{
输出:{
inlineDynamicImports: true,
},
},
},
.
})
这样,构造完成后,dist目录下就有两个文件style.css和xxx.umd.js。
现在我们将生成index.html。
因为vite在开发状态下直接使用es模块,没有打包,所以开发状态下生成的index.html和生产中生成的index.html是不一样的。
我们修改项目根目录下的index.html如下:
!声明文档类型
html lang=en
头
meta charset=UTF-8 /
link rel= icon type= image/SVG XML href=/src/favicon . SVG rel= external no follow /
meta name= viewport content= width=device-width,initial-scale=1.0 /
title邀请应用程序/标题
!-样式占位符-
/头
身体
div id=root/div
!-脚本占位符-
/body
/html
注意这两行注释,我们将在开发状态和生产构建中区别对待它们。
vite插件API中有一个transformindexhtml,可以自定义开发状态下的html内容。因此,我们的开发状态的配置如下:
//https://vitejs.dev/config/
导出默认定义配置({
.
插件:[
.
{
名称:“开发html”,
申请:服务,
transformIndexHtml(indexHtml:string){
返回索引Html。替换(!-样式占位符-,)。替换(!-脚本占位符-,脚本类型=模块 src=/src/index . tsx /script );
},
},
.
],
});
制作需要使用插件@rollup/plugin-html来定制html内容。
从“@rollup/plugin-html”导入html;
从“fs”导入fs;
const entryHtml=fs.readFileSync(。/index.html ,{编码: utf-8 });
导出默认定义配置({
.
插件:[
.
{
名称:“构建html”,
应用:“构建”,
.html({
模板:()={
返回entryHtml。替换(
!-样式占位符-,
link rel= style sheet type= text/CSS href= style . CSS rel= external no follow /,
)。替换(
!-脚本占位符-,
` script type= text/JavaScript src= $ { name } . UMD . js /script `,
);
},
}),
},
.
],
});
通过上面的配置和重新构建,钱坤可以加载这个子应用程序。
其他说明
1. 老旧浏览器的支持
因为我这次的项目是中后端项目,因为没有老浏览器的强力支持,所以没有在项目中处理。其实官方vite也给出了解决方案,就是plugin @vitejs/plugin-legacy。
原理也很简单,就是用script nomodule在不支持ES模块的浏览器中执行相关脚本,用SystemJS加载模块。
2. 关于 TypeScript 的说明
脚手架初始化后,可以用TypeScript开发。这里需要打开编译器选项isolatedModules:true,因为vite使用esbuild处理ts文件,只将ts转换为js,不进行类型检查(依赖编辑器处理类型检查,比如vscode)。所以在遇到一些纯类型的导入导出时会出错,应该开启isolatedModules:true来避免这个问题。如果由于某种原因无法打开这个选项,可以使用roll up-plugin-friendly-type-imports包。这个包的自述文件也解释了为什么会有这样的问题。
3. 对接 CDN
基于以上配置的结果,浏览器加载资源时,总是使用根路径(/)来加载。如果使用CDN,就会有资源负载404的问题。
我们可以配置base来设置基路径,类似于webpack的PUBLIC_PATH。
导出默认定义配置({
基:“/some/public/path”,
})
4. 构建出错
4.1 找不到包
错误消息是:
[插件:vite:dep-scan]无法解析包“xxx”的条目
通常根据包的不同,package.json中main、module等字段配置不正确,导致vite找不到包的入口。
您可以设置一个别名来将其映射到正确的文件。
导出默认定义配置({
解决:{
别名:[{
找到:/^SOME_PACKAGE_NAME$/,
替换: SOME _ PACKAGE _ NAME/dist/XXX . es . js ,
}],
},
});
4.2 请求超时
错误消息是:
net:ERR_ABORTED 408(请求超时)
启动开发服务器后,浏览器遇到请求超时错误。因为vite检测到对依赖包的请求,而依赖还没有被vite处理,所以会触发预构建,导致请求超时和页面过载。
我们可以刷新几次,等待vite完成预构建,也可以在optimizeDeps.include中添加依赖关系,提前处理。
4.3 导入模块出错
错误消息是:
内部服务器错误:无法解析导入。/chunk-7L3SPMWF.js 来自 node_modules/。vite/antd.js?v=7bec0e27 。文件存在吗?
可能是因为现在还不支持一些依赖包输出的格式,vite。你可以看看这一期。
这个错误只存在于运行处理开发服务器的过程中,页面正常显示后不会出现。忽略这个错误后,目前没有任何影响。
小结
总的来说,vite已经基本具备了生产和使用的条件。如果是常规的应用开发,vite的配置非常简单,可以说是开箱即用。如果需要添加额外的配置,也非常方便。
目前很大的问题是周边生态还不是特别成熟,很多成熟的包对vite(ES模块)的支持比较弱。同时,如果团队中基础设施氛围浓厚,自研工具包也要考虑这方面。
关于vite构建项目和支持微前端的这篇文章到此为止。关于vite建筑项目的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。