搭建 Webpack + TypeScript + Babel 的项目
安装依赖包
安装 webpack 相关的依赖:
npm i -D webpack webpack-cli
安装 ts、babel、source-map 的 loader:
npm i -D ts-loader babel-loader source-map-loader
安装 babel 的核心:
npm i -D @babel/core
安装 babel 的预设器,转换 js 语法的预设器和转换 ts 为 js 的预设器:
npm i -D @babel/preset-env @babel/preset-typescript
安装 babel 的插件,以减少最终 js 代码生成的大小:
npm i -D @babel/plugin-transform-runtime
安装 babel 的工具,必须作为 dependencies:
npm i @babel/runtime
配置 webpack.config.js
接下来在项目根目录创建一个 webpack 配置文件:
webpack.config.dev.js:
点击查看 webpack.config.dev.js 代码
module.exports = {
entry: "./src/main.ts",
mode: "development",
output: {
path: path.resolve(__dirname, "dist/dev"),
filename: "bundle.js"
},
devtool: "source-map",
resolve: {
extensions: [ ".ts", ".tsx", ".js" ]
},
module: {
rules: [
{ test: /\.tsx?$/, loader: "ts-loader", exclude: /(node_modules|bower_components)/ },
{
test: /\.ts$/,
use: {
loader: "babel-loader",
options: {
presets: [
[
"@babel/preset-env",
{
targets: {
"chrome": "58",
"ie": "11"
}
}
], [ "@babel/preset-typescript" ]
],
plugins: [ "@babel/transform-runtime" ]
}
},
exclude: /(node_modules|bower_components)/
},
{ test: /\.js$/, loader: "source-map-loader", exclude: /(node_modules|bower_components)/ }
]
}
};
webpack.config.pro.js:
点击查看 webpack.config.pro.js 代码
const path = require("path");
module.exports = {
entry: "./src/main.ts",
mode: "production",
output: {
path: path.resolve(__dirname, "dist/pro"),
filename: "bundle.js"
},
resolve: {
extensions: [ ".ts", ".tsx", ".js" ]
},
module: {
rules: [
{ test: /\.tsx?$/, loader: "ts-loader", exclude: /(node_modules|bower_components)/ },
{
test: /\.ts$/,
use: [
{
loader: "babel-loader",
options: {
presets: [
[
"@babel/preset-env",
{
targets: {
"chrome": "58",
"ie": "11"
}
}
], [ "@babel/preset-typescript" ]
],
plugins: [ "@babel/transform-runtime" ]
}
}
],
exclude: /(node_modules|bower_components)/
}
]
}
};
配置项的简单说明
配置文件中主要有以下几个大的选项:entry、mode、output、devtool、resolve、module。
entry 是你的项目主要入口文件,webpack 将从这个文件开始进行打包处理。mode 是你这个配置文件适用于哪一种环境,如开发环境和生产环境。在开发环境中我们使用 devtool,即 sourcemaps 方便我们控制台调试代码,而生产环境中就不需要这个东西。
output 是我们的文件最终产生在哪个文件夹内,resolve 我只使用了 extensions 这一个配置,这个配置就是处理我们项目里哪些文件。请看这里resolve.extensions - CSDN。
module 这一个配置项就非常的重要了,里面有 rules 数组选项,我们的 loader 就全部配置在这里。
项目结构图
project
-node_modules
-src
main.ts
tsconfig.json
package.json
package-lock.json
webpack.config.dev.js
webpack.config.pro.js
配置各个 loader
ts-loader
module: {
rules: [ { test: /\.tsx?$/, loader: "ts-loader", exclude: /(node_modules|bower_components)/ } ]
}
bable-loader
module: {
rules: [
{ test: /\.tsx?$/, loader: "ts-loader", exclude: /(node_modules|bower_components)/ },
{
test: /\.ts$/,
use: {
loader: "babel-loader",
options: {
presets: [
[
"@babel/preset-env",
{
targets: {
"chrome": "58",
"ie": "11"
}
}
], [ "@babel/preset-typescript" ]
],
plugins: [ "@babel/transform-runtime" ]
}
},
exclude: /(node_modules|bower_components)/
},
{ test: /\.js$/, loader: "source-map-loader", exclude: /(node_modules|bower_components)/ }
]
}
注意看第二个 loader 的配置,使用了 use 字段。其中一共有三个配置项:loader、options、plugins。loader 毫无疑问是 babel-loader。
options 下有一个预设 presets,是一个数组,第一个数组中有两个值,@babel/preset-env和@babel/preset-typescript。
babel 把高于 ES5 的语法转换成 ES5 以下的语法,因此需要 @babel/preset-env 预设。预设的执行顺序是逆向的执行的,按道理来说先执行 typescript 的预设,然后再把 js 文件的语法转换到低版本的语法。
plugins,即 babel 的插件,请直接查看 Webpack 官方文档的解释:babel-loader。
测试项目
我们随便写两个 ts 函数,试一试这个项目是否成功运行。package.json 添加运行脚本"build": "webpack --config webpack.config.pro.js":
function entry(msg: string, onEntry: (msg: string) => void): void {
onEntry(msg);
}
entry("Hello World!", (e) => {
console.log(e);
});
interface OnEnter {
(msg: string): void;
}
function enter(msg: string, onEnter: OnEnter) {
onEnter(msg);
}
enter("Hello World!", (e) => {
console.log(e);
});
测试结果
console.log("Hello World!"),function(o,l){var e;e="Hello World!",console.log(e)}();
项目模板仓库
如果不想自己配置,可以基于我的模板仓库,根据自己的需求再加以改造:
- GitHub:webpack-ts-babel-template
- Gitee:webpack-ts-babel-template
搭建 Webpack + TypeScript + Babel 的项目的更多相关文章
- 教你搭建基于typescript的vue项目
自尤大去年9月推出vue对typescript的支持后,一直想开箱尝试,对于前端sr来说,vue的顺滑加上ts的面向对象,想着就非常美好~ 终于在两个月前,找到了个机会尝试了一把vue+ts的组合. ...
- 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目
一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用 ...
- webpack + typescript + babel打包*.min.js文件的环境配置
将多个*.ts文件打包成一个*.min.js文件的开发配置 1.初始化 npm init 新建以下文件目录: 2.安装依赖: "devDependencies": { " ...
- Vue + WebPack + Typescript初学者VSCode项目 (按需加载、跨域调试、await/async)
万事开头难,一个好的Hello World程序可以节省我们好多的学习时间,帮助我们快速入门.Hello World程序之所以是入门必读必会,就是因为其代码量少,简单易懂.但我觉得,还应该做到功能丰富, ...
- WEBPACK & BABEL 打包项目
本文首发于 BriFuture's Blog. 最近在用 Vue 重写之前的一个项目 Compass,这个项目以前是用 QML + JavaScript 在 Qt 平台上搭建的.这是我本科毕设时做的一 ...
- 手动搭建Vue之前奏:搭建webpack项目
手动搭建vue项目 搭建vue前首先搭建webpack项目 首先你应当安装一下npm以及nodejs 安装完成后,进行如下操作: // 创建项目根目录 mkdir some_project_name ...
- vue 项目中 自定义 webpack 的 配置文件(webpack.config.babel.js)
webpack.config.babel.js,这样命名是想让webpack在编译的时候自动识别es6的语法,现在貌似不需要这样命名了,之前用webpack1.x的时候貌似是需要的 let path ...
- TypeScript在react项目中的实践
前段时间有写过一个TypeScript在node项目中的实践. 在里边有解释了为什么要使用TS,以及在Node中的一个项目结构是怎样的. 但是那仅仅是一个纯接口项目,碰巧赶上近期的另一个项目重构也由我 ...
- 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发 ...
随机推荐
- linux 查询文件命令
jps; 当前服务器中所有的java进程: jps |grep XXX; 查询当前服务器某个进程: locate xxx;查询某个文件的位置:
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- MTK 平台sensor arch 介绍-hal
MTK 平台sensor arch 介绍-hal 一:整体框架 二:具体流程简介 AP-HAL: (1)init & control flow 我们以前文的originchannel 的 ac ...
- go-zero 微服务实战系列(一、开篇)
前言 在社区中经常看到有人问有没有基于 go-zero 的比较完整的项目参考,该类问题本质上是想知道基于 go-zero 的项目的最佳实践.完整的项目应该是一个完整的产品功能,包含产品需求.架构设计. ...
- 使用pip安装库或执行pip命令时报错解决方案
初次安装pip后执行安装升级一般不会有问题,但是国外的镜像源下载升级由于网速过慢会进行报错,提示需要升级 pip 或者下载速度很慢最后直接报了错如下图: 这个时候只需要修改镜像源即可,建议修改为永久镜 ...
- NPM Error:gyp: No Xcode or CLT version detected!
问题 最近在macOS Catalina中使用npm安装模块,经常会出现如下错误: > node-gyp rebuild No receipt for 'com.apple.pkg.CLTool ...
- DYOJ 【20220317模拟赛】瞬间移动 题解
瞬间移动 题意 三维空间中从 \((0,0,0)\) 开始,每次移动 1,问刚好走 \(N\) 次能到 \((X,Y,Z)\) 的方案数 \(N\le10^7\),答案模 \(998244353\) ...
- Base64编码知识详解
在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...
- zabbix监控mysql主从同步
获取主从复制sql线程和I/O线程状态是否为yes #!/bin/bash HOSTNAME="数据库IP" PORT="端口" USERNAME=" ...
- Markdown第一次学习
# # Markdown学习 一级标题: #空格+标题名称+回车得到一级标题 ## 二级标题 一级标题方法中变成两个##号 ### 三级标题 变成三个###号,以此类推,最多到六级标题 ## 字体 h ...