Rollup构建TS项目
Rollup 打包很快,体积很小,学习一下
配置环境
npm init -y 生成 package.json
tsc --init 生成 tsconfig.json
- 创建
rollup.config.js
- 创建入口问题
/src/index.ts文件和public/index.html文件
安装依赖
- 全局安装rollup
npm install rollup-g
- 安装TypeScript
npm install typescript -D
- 安装TypeScript 转换器
npm install rollup-plugin-typescript2 -D
- 安装代码压缩插件
npm install rollup-plugin-terser -D
- 安装rollupWeb服务
npm install rollup-plugin-serve -D
- 安装热更新
npm install rollup-plugin-livereload -D
- 引入外部依赖
npm install rollup-plugin-node-resolve -D
- 安装配置环境变量用来区分本地和生产
npm install cross-env -D
- 替换环境变量给浏览器使用
npm install rollup-plugin-replace -D
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| { "name": "rollupTs", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "cross-env NODE_ENV=development rollup -c -w", "build": "cross-env NODE_ENV=produaction rollup -c" }, "type": "module", "keywords": [], "author": "", "license": "ISC", "devDependencies": { "cross-env": "^7.0.3", "rollup-plugin-livereload": "^2.0.5", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0", "rollup-plugin-serve": "^1.1.0", "rollup-plugin-terser": "^7.0.2", "rollup-plugin-typescript2": "^0.31.1", "typescript": "^4.5.5" } }
|
rollup -c:打包命令
rollup -c -w:启动本地服务命令
cross-env NODE_ENV=development:配置node process.env环境变量用来区分本地和生产,注意,这在浏览器中不能直接获取的,需要插件replace配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import path from 'path' import ts from 'rollup-plugin-typescript2' import { terser } from 'rollup-plugin-terser' import server from 'rollup-plugin-serve' import livereload from 'rollup-plugin-livereload' import replace from 'rollup-plugin-replace' import { fileURLToPath } from 'url' const __filenameNew = fileURLToPath(import.meta.url) const __dirnameNew = path.dirname(__filenameNew) const isDev = () => { return process.env.NODE_ENV === 'development' } export default { input: './src/index.ts', output: { file: path.resolve(__dirnameNew, './lib/index.js'), format: 'umd', sourcemap: true, }, plugins: [ ts(), isDev() && livereload(), terser({ compress: { drop_console: !isDev(), } }), replace({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) }), isDev() && server({ open: true, port: 1988, openPage: '/public/index.html', }),
]
}
|
js代码使用环境变量
1 2 3 4 5 6 7 8
| let label: string = 'hale最喜欢八味'; console.log(label) if (process.env.NODE_ENV === 'development') { alert('开发') } else { alert('生产') } console.log(process.env.NODE_ENV)
|
TS配置需要注意的
1 2 3 4 5
| { "module": "ES2015", "sourceMap": true, }
|
Webpack构建TS项目
配置环境
npm init -y 生成 package.json
- 创建入口问题
/src/index.ts文件和public/index.html文件
tsc --init 生成 tsconfig.json
- 创建
webpack.config.js
安装依赖
- 安装webpack
npm install webpack -D
- webpack4以上需要
npm install webpack-cli -D
- 编译TS
npm install ts-loader -D
- TS环境
npm install typescript -D
- 热更新服务
npm install webpack-dev-server -D
- HTML模板
npm install html-webpack-plugin -D
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| { "name": "webpackTs", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack-dev-server", "build": "webpack" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "html-webpack-plugin": "^5.5.3", "ts-loader": "^9.4.4", "typescript": "^5.1.6", "webpack": "^5.88.2", "webpack-cil": "0.0.1-security", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" }, "dependencies": {} }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| const path = require('path') const htmlWebpackPlugin = require('html-webpack-plugin') module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, './dist'), filename: "index.js" }, mode: "development", stats: "none", resolve: { extensions: ['.ts', '.js'], alias: { '@': path.resolve(__dirname, './src') } }, module: { rules: [ { test: /\.ts$/, use: "ts-loader" } ] }, devServer: { port: 1995, proxy: {} }, plugins: [ new htmlWebpackPlugin({ template: "./public/index.html" }) ] }
|
esbuild + swc 构建ts项目
前端工具层出不穷,之前有常用的打包工具webpack,现在有了速度更快的vite。 vite的开发模式是基于esBuild编译的,打包又是基于rollup,启动项目是很快的。
esbuild为什么这么快
在esbuild的官方介绍中打包threejs 只需要0.37秒 无限接近于亚索的Q技能冷却时间可以说是很快了。
esbuild是go语言编写的并且是多线程执行,性能是js的好几十倍,所以很快。
- 无需缓存即可实现基础打包
- 支持 ES6 跟 CommonJS 模块
- 支持ES 6 Tree Shaking
- 体积小
- 插件化
- 其他
- 内置支持编译 jsx
SWC
SWC则宣称其比Babel快20倍(四核情况下可以快70倍)
wc是用rust写的,所实现的功能跟babel一样,es6语法转es5,但是速度比babel更快,前端基建工具使用rust的是越来越多了,未来可能还会有一个替代postCss的😂。
那如果把esbuild + swc结合起来构建那岂不是接近光速 我们来try try
配置环境
npm init -y 生成 package.json
tsc --init 生成 tsconfig.json
- 创建
config.js
- 创建入口问题
/src/index.ts文件和public/index.html文件
安装依赖
- 全局安装
npm install @swc/core esbuild @swc/helpers
- 安装nodeTs声明
npm install --save-dev @types/node
其中,@swc/core 是 swc 的核心包,用于编译 JavaScript 和 TypeScript 代码;esbuild 是一个快速的 JavaScript 和 TypeScript 构建工具;@swc/helpers 是 swc 的辅助包,用于转换 JSX 代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import esbuild from 'esbuild' import swc from '@swc/core' import fs from 'node:fs' await esbuild.build({ entryPoints: ['./index.ts'], bundle: true, loader: { '.js': 'js', '.ts': 'ts', '.jsx': 'jsx', '.tsx': 'tsx', }, treeShaking:true, define: { 'process.env.NODE_ENV': '"production"', }, plugins: [ { name: "swc-loader", setup(build) { build.onLoad({ filter: /\.(js|ts|tsx|jsx)$/ }, (args) => { const content = fs.readFileSync(args.path, "utf-8") const { code } = swc.transformSync(content, { filename: args.path }) return { contents: code } }) }, } ], outdir: "dist" })
|
测试demo
1 2 3 4 5
| export const a:number = 1 export const b:string = 'ikun' let x = 1 let fn = () => 123 console.log(x,fn);
|
转移之后的
1 2 3 4 5 6 7
| export var a = 1; export var b = "ikun"; var x = 1; var fn = function() { return 123; }; console.log(x, fn);
|
除了上述基本用法之外,swc 和 esbuild 还提供了许多高级用法,可以更好地满足我们的构建需求。
插件系统
swc 和 esbuild 都提供了插件系统,可以通过插件来扩展其功能。例如,swc 的插件可以用于优化代码,提高性能。esbuild 的插件则可以用于处理特定类型的文件,或自定义转换规则。
缓存系统
swc 和 esbuild 都提供了缓存系统,可以减少重复编译时间。当文件内容没有发生变化时,swc 和 esbuild 会从缓存中读取已编译的代码,以提高构建速度。
Watch 模式
swc 和 esbuild 都支持 Watch 模式,可以在文件发生变化时自动重新编译代码。Watch 模式可以减少手动运行构建命令的频率,提高开发效率。
自定义插件
最后,我们可以通过编写自定义插件来扩展 swc 和 esbuild 的功能。例如,可以编写一个插件来自动引入 CSS 文件,或者优化 JavaScript 代码。自定义插件可以根据实际需求进行编写,以更好地满足项目的构建需求。
结论
本文介绍了如何使用 swc 和 esbuild 来构建一个简单的 TypeScript 应用程序,并讨论了一些高级用法。swc 和 esbuild 都是现代前端构建工具中的代表,它们都提供了快速编译、代码压缩等功能,可以有效提高应用程序的性能。通过学习 swc 和 esbuild 的使用方法,我们可以更好地进行前端工程化开发,提高开发效率和代码质量。