搭建 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开发 ...
随机推荐
- Navicat 连接 MySQL
目录 简述 新建连接 常见错误 简述 Navicat 是一套快速.可靠和全面的数据库管理工具,专门用于简化数据库管理和降低管理成本.Navicat 图形界面直观,提供简便的管理方法,设计和操作 MyS ...
- MAC NGINX PHP XDEBUG
1. 安装 homebrew 2. 安装nginx ; 终端运行 brew install nginx: 1)给nginx 设置管理员权限:如果不设置管理员权限,80端口是不能监听的: #这里的目录根 ...
- 轻量级多级菜单控制框架程序(C语言)
1.前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计:很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网上有很多这种菜单框架 ...
- 分享一个网上搜不到的「Redis」实现「聊天回合制」的方案
前言 为什么说网上搜不到,因为关于聊天回合制的方案作者本人快把百度搜秃噜了也没找到,好在最终是公司一个关系不错的大佬帮提供了点思路,最终作者将其完整实现了出来. 分享出来大家可以收藏,万一你哪天也碰到 ...
- go-zero微服务实战系列(五、缓存代码怎么写)
缓存是高并发服务的基础,毫不夸张的说没有缓存高并发服务就无从谈起.本项目缓存使用Redis,Redis是目前主流的缓存数据库,支持丰富的数据类型,其中集合类型的底层主要依赖:整数数组.双向链表.哈希表 ...
- 手把手教你实现一个Vue无限级联树形表格(增删改)
前言平时我们可能在做项目时,会遇到一个业务逻辑.实现一个无限级联树形表格,什么叫做无限级联树形表格呢?就是下图所展示的内容,有一个祖元素,然后下面可能有很多子孙元素,你可以实现添加.编辑.删除这样几个 ...
- SAP APO-供需匹配
供需匹配包含主要功能"匹配能力"(CTM)和一个用于分配库存的附加功能. 在高级计划和优化中,SDM组件为这些应用程序提供跨工厂供应策略- 生产计划和详细计划(PP / DS) 供 ...
- Codeforces Round #780 (Div. 3)
A. Vasya and Coins 题目链接 题目大意 Vasya 有 a 个 1-burle coin,有 b 个 2-burle coin,问他不能通过不找钱支付的价格的最小值. 思路 如果 a ...
- REST 表现层状态转化
1.REST是什么? 1) REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展 ...
- 数学工具类Math
概述 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.类似这样的工具 类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单 基本运算的方法 ...