安装依赖包

安装 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)}();

项目模板仓库

如果不想自己配置,可以基于我的模板仓库,根据自己的需求再加以改造:

  1. GitHub:webpack-ts-babel-template
  2. Gitee:webpack-ts-babel-template

搭建 Webpack + TypeScript + Babel 的项目的更多相关文章

  1. 教你搭建基于typescript的vue项目

    自尤大去年9月推出vue对typescript的支持后,一直想开箱尝试,对于前端sr来说,vue的顺滑加上ts的面向对象,想着就非常美好~ 终于在两个月前,找到了个机会尝试了一把vue+ts的组合. ...

  2. 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目

    一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用 ...

  3. webpack + typescript + babel打包*.min.js文件的环境配置

    将多个*.ts文件打包成一个*.min.js文件的开发配置 1.初始化 npm init 新建以下文件目录: 2.安装依赖: "devDependencies": { " ...

  4. Vue + WebPack + Typescript初学者VSCode项目 (按需加载、跨域调试、await/async)

    万事开头难,一个好的Hello World程序可以节省我们好多的学习时间,帮助我们快速入门.Hello World程序之所以是入门必读必会,就是因为其代码量少,简单易懂.但我觉得,还应该做到功能丰富, ...

  5. WEBPACK & BABEL 打包项目

    本文首发于 BriFuture's Blog. 最近在用 Vue 重写之前的一个项目 Compass,这个项目以前是用 QML + JavaScript 在 Qt 平台上搭建的.这是我本科毕设时做的一 ...

  6. 手动搭建Vue之前奏:搭建webpack项目

    手动搭建vue项目 搭建vue前首先搭建webpack项目 首先你应当安装一下npm以及nodejs 安装完成后,进行如下操作: // 创建项目根目录 mkdir some_project_name ...

  7. vue 项目中 自定义 webpack 的 配置文件(webpack.config.babel.js)

    webpack.config.babel.js,这样命名是想让webpack在编译的时候自动识别es6的语法,现在貌似不需要这样命名了,之前用webpack1.x的时候貌似是需要的 let path ...

  8. TypeScript在react项目中的实践

    前段时间有写过一个TypeScript在node项目中的实践. 在里边有解释了为什么要使用TS,以及在Node中的一个项目结构是怎样的. 但是那仅仅是一个纯接口项目,碰巧赶上近期的另一个项目重构也由我 ...

  9. 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例

    使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发 ...

随机推荐

  1. 开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用

    微软的Workflow Foundation基于.Net Framework,并且没有向.Net Core迁移的计划.我们的很多项目使用了工作流引擎,这些项目向.Net Core以及更高版本迁移时遇到 ...

  2. 【算法】Floyd算法

    什么是Floyd Floyd用于求最短路程.举个栗子,给你一张图,让你求出点[1]到点[5]的最短路程,你会怎么求? (画图工具:CS Academy) 如上图,有向边分别是 1->2  1-& ...

  3. 渗透测试之sql注入验证安全与攻击性能

    由于渗透测试牵涉到安全性以及攻击性,为了便于交流分享,本人这里不进行具体网址的透露了. 我们可以在网上查找一些公司官方网站如(http://www.XXXXXX.com/xxxx?id=1) 1.拿到 ...

  4. PyTorch DataLoader NumberWorkers Deep Learning Speed Limit Increase

    这意味着训练过程将按顺序在主流程中工作. 即:run.num_workers.   ,此外, ,因此,主进程不需要从磁盘读取数据:相反,这些数据已经在内存中准备好了. 这个例子中,我们看到了20%的加 ...

  5. kubernetes code-generator使用

    目录 Overview Prerequisites CRD code-generator 编写代码模板 code-generator Tag说明 开始填写文件内容 type.go doc.go reg ...

  6. SAP 文本框多行输入

    REPORT zjw_test01. CONSTANTS: gc_text_line_length TYPE i VALUE 72. TYPES: text_table_type(gc_text_li ...

  7. WPF开发随笔收录-唯一标识符GUID

    一.前言 该系列博客用于记录本人在WPF开发过程中遇到的各种知识点 二.正文 1.在工作的项目中,软件需要用到在线升级功能,由于第一次弄,在下载服务端的文件到本地时,文件的名称我选择直接生成为固定的格 ...

  8. idea显示 RunDashboard ,多个启动项时列表显示

    在.idea(项目所在文件夹中)下的workspace.xml文件中找到 <component name="RunDashboard"> 标签,然后添加如下节点 < ...

  9. NC20439 [SHOI2017]期末考试

    NC20439 [SHOI2017]期末考试 题目 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布.第 \(i\) 位同学希望在第 \ ...

  10. vmstate 命令详解2022

    vmstat 是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过 vmstat 来发现系统中的瓶颈呢? 1. 使用vmstat 使用前我们先看下命令介绍及参数定义 Usag ...