【10分钟速通webpack,全流程打包,编译,发包,全干货,附代码 】

需求

后端有个nodejs 基础库,用typescript编写,需要发包到代码仓库上,被其它业务引入。这其中就涉及了: 编译, 打包,发包。

工作流速览

前提依赖

webpack主体

npm install --save-dev  webpack webpack-cli

webpack插件

npm install --save-dev webpack-node-externals  ts-loader 

编译相关

npm instsall --save-dev typescript

基础示例

这个是工作流,可以看到从最初的源文件,一直到发包的打包文件的转换过程。这其中涉及到3个配置文件

  • package.json 用于包依赖管理(装依赖 和 发包)
  • webpackage.config.js 用于触发编译(typescript编译) 和 打包(把编译后的文件 打到一个文件里
  • tsconfig.json 用于编译使用,将typescript文件编译成JavaScript文件。

tsconfig.json

{
    "compilerOptions": {
        "baseUrl": "./",
        "declaration": true,
        "allowSyntheticDefaultImports": true,
        "skipLibCheck": true,
        "emitDecoratorMetadata": true,
        "resolveJsonModule": true,
        "esModuleInterop": true,
        "experimentalDecorators": true,
        "lib": ["es2015", "es2016", "es2017.object", "es2020.Promise", "esnext.asynciterable", "dom"],
        "module": "nodeNext",
        "moduleResolution": "nodeNext",
        "noImplicitAny": false,
        "outDir": "./dist",
        "composite": true,
        "sourceMap": true,
        "strict": true,
        "strictPropertyInitialization": false,
        "target": "es2017",
        "types": ["jest"],
        // "types": ["node"],
        "typeRoots": ["node_modules/@types"],
    },
    "compileOnSave": true,
    "include": ["src/**/*", "index.ts"],
    "exclude": ["node_modules/**/*", "**/*.d.ts", "test"],
}

webpack.config.js

const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
    entry: './src/index.ts', // 指定入口文件为 src 目录下的 index.ts
    target: 'node', // 指定打包目标为Node环境
    externals: [nodeExternals()], // 排除 node_modules 中的模块
    devtool: 'source-map',
    module: {
        rules: [
            {
                test: /\\.ts$/,
                use: 'ts-loader',
                exclude: /node_modules/,
            },
        ],
    },
    resolve: {
        extensions: ['.tsx', '.ts', '.js'],
        preferRelative: true,
    },
    output: {
        filename: 'bundle.js', // 输出文件名
        path: path.resolve(__dirname, 'dist'), // 输出目录设置为根目录下的 dist 文件夹
        libraryTarget: "commonjs" 
    },
};

  • target: 指定运行时环境,这里是在后端node环境运行,填写node。
  • exclude: 排除 node_module等不需要打包的文件。
  • debug: source map, 关联打包文件和源文件,以开启 vscode等IDE debug时的断点。
  • 编译:会用tsconfig.json文件进行编译

编译后打包

npx webpack

执行webpack的过程,会先触发编译下,然后打包

解释结果

编制结果在 dist文件夹里,可以查看里面内容如下,ls ./dist

bundle.js :就是webpack打包的结果。
bundle.js.map :用于debug的文件,source map参数开始后,关联bundle.js和源码的文件。
index.d.ts :声明文件,typescript 编译index.ts时,产生的声明文件,src 里包含了其它*.ts的声明文件。

发包

package.json

最后,如果要发包注意下 package.json, main的入口是打包的文件生成的地方,

{
  "name": "nodejs-webpack-demo",
  "version": "1.0.0",
  "description": "",
  "main": "./dist/bundle.js",
  "types": "./dist/index.d.ts", 
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "ts-loader": "^9.5.1",
    "webpack": "^5.92.1",
    "webpack-cli": "^5.1.4",
    "webpack-node-externals": "^3.0.0"
  },
  "dependencies": {
    "mongoose": "^8.4.4"
  }
}

同时注意下,webpack.config.js里面的output中的libraryTarget,需要根据不同的运行环境,输出为指定格式,否则无法引入使用。

发包命令,用npm发包,进入到包的目录下

// 如果需要使用私有仓库
npm config set registry <https://your-registry.com>
// 登录
npm login
// 发包
npm publish

或是用 yarn ,注意这个需要在 包的外层执行 ,假设你的包文件是common,则需要在路径…/common, 即包文件的外层执行

yarn publish --registry=http://127.0.0.1:8081/repository/my-npm-repo/ --new-version 1.0.0 common

代码参考

代码地址 :https://github.com/Wunan777/webpack-demo

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值