IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Webpack构建一个原生Ts多入口项目 -> 正文阅读

[JavaScript知识库]Webpack构建一个原生Ts多入口项目

第一步,初始化webpack

npm init -y(生成package.json)

第二步,下载构建工具

npm i -D webpack webpack-cli typescript ts-loader

       webpack:构建工具webpack

    webpack-cli:webpack的命令行工具

    typescript:ts的编译器

    ts-loader:ts加载器,用于在webpack中编译ts文件

第三步,创建配置文件:webpack.config.js

const path = require('path')
module.exports = {
    // mode: 'production',
    mode: 'development',    
    entry: {
        index: './src/index.ts',
        detail: './src/detail.ts'
    },
    output: {
        path: path.resolve(__dirname, 'dist'), // 指定打包文件的目录
        filename: '[name].js' // 打包后文件的名称
    },
    // 指定webpack打包时要使用的模块
    module: {
        // 指定loader加载的规则
        rules: [{
            test: /\.ts$/, // 指定规则生效的文件:以ts结尾的文件
            use: 'ts-loader', // 要使用的loader
            exclude: /node-modules/ // 要排除的文件
        }]
    }, // 设置哪些文件类型可以作为模块被引用
    resolve: {
        extensions: ['.ts', '.js']
    },

}

第四步,创建tsconfig.json

直接从别的地方拷贝过来的,可以根据需要自己修改;

{
    "compilerOptions": {
        /* Visit https://aka.ms/tsconfig.json to read more about this file */
        /* Basic Options */
        // "incremental": true,                         /* Enable incremental compilation */
        "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
        "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
        // "lib": [],                                   /* Specify library files to be included in the compilation. */
        // "allowJs": true,                             /* Allow javascript files to be compiled. */
        // "checkJs": true,                             /* Report errors in .js files. */
        // "jsx": "preserve",                           /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
        // "declaration": true,                         /* Generates corresponding '.d.ts' file. */
        // "declarationMap": true,                      /* Generates a sourcemap for each corresponding '.d.ts' file. */
        // "sourceMap": true,                           /* Generates corresponding '.map' file. */
        // "outFile": "./",                             /* Concatenate and emit output to single file. */
        // "outDir": "./",                              /* Redirect output structure to the directory. */
        // "rootDir": "./",                             /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
        // "composite": true,                           /* Enable project compilation */
        // "tsBuildInfoFile": "./",                     /* Specify file to store incremental compilation information */
        // "removeComments": true,                      /* Do not emit comments to output. */
        // "noEmit": true,                              /* Do not emit outputs. */
        // "importHelpers": true,                       /* Import emit helpers from 'tslib'. */
        // "downlevelIteration": true,                  /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
        // "isolatedModules": true,                     /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
        /* Strict Type-Checking Options */
        "strict": true, /* Enable all strict type-checking options. */
        // "noImplicitAny": true,                       /* Raise error on expressions and declarations with an implied 'any' type. */
        // "strictNullChecks": true,                    /* Enable strict null checks. */
        // "strictFunctionTypes": true,                 /* Enable strict checking of function types. */
        // "strictBindCallApply": true,                 /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
        // "strictPropertyInitialization": true,        /* Enable strict checking of property initialization in classes. */
        // "noImplicitThis": true,                      /* Raise error on 'this' expressions with an implied 'any' type. */
        // "alwaysStrict": true,                        /* Parse in strict mode and emit "use strict" for each source file. */
        /* Additional Checks */
        // "noUnusedLocals": true,                      /* Report errors on unused locals. */
        // "noUnusedParameters": true,                  /* Report errors on unused parameters. */
        // "noImplicitReturns": true,                   /* Report error when not all code paths in function return a value. */
        // "noFallthroughCasesInSwitch": true,          /* Report errors for fallthrough cases in switch statement. */
        // "noUncheckedIndexedAccess": true,            /* Include 'undefined' in index signature results */
        // "noPropertyAccessFromIndexSignature": true,  /* Require undeclared properties from index signatures to use element accesses. */
        /* Module Resolution Options */
        // "moduleResolution": "node",                  /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
        // "baseUrl": "./",                             /* Base directory to resolve non-absolute module names. */
        // "paths": {},                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
        // "rootDirs": [],                              /* List of root folders whose combined content represents the structure of the project at runtime. */
        // "typeRoots": [],                             /* List of folders to include type definitions from. */
        // "types": [],                                 /* Type declaration files to be included in compilation. */
        // "allowSyntheticDefaultImports": true,        /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
        "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
        // "preserveSymlinks": true,                    /* Do not resolve the real path of symlinks. */
        // "allowUmdGlobalAccess": true,                /* Allow accessing UMD globals from modules. */
        /* Source Map Options */
        // "sourceRoot": "",                            /* Specify the location where debugger should locate TypeScript files instead of source locations. */
        // "mapRoot": "",                               /* Specify the location where debugger should locate map files instead of generated locations. */
        // "inlineSourceMap": true,                     /* Emit a single file with source maps instead of having a separate file. */
        // "inlineSources": true,                       /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
        /* Experimental Options */
        // "experimentalDecorators": true,              /* Enables experimental support for ES7 decorators. */
        // "emitDecoratorMetadata": true,               /* Enables experimental support for emitting type metadata for decorators. */
        /* Advanced Options */
        "skipLibCheck": true, /* Skip type checking of declaration files. */
        "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
    }
}

第五步,创建src里面的文件

如图所示:

第六步,然后安装常用插件;

配置plugins:

1、安装热更新插件。?html-webpack-plugin

? ? ? ? 安装:npm i -D html-webpack-plugin

? ? ? ? 引入并配置:

????????const HtmlWebpackPlugin = require('html-webpack-plugin')

????????

        new HtmlWebpackPlugin({
            // title: "哈哈哈哈",
            // 复制出来的html文件,会默认引入js代码
            filename: "index.html",
            // 要处理的html文件地址
            template: "./src/index.html",
            chunks: ['index']
        }),
        new HtmlWebpackPlugin({
            // title: "哈哈哈哈",
            // 复制出来的html文件,会默认引入js代码
            filename: "detail.html",
            // 要处理的html文件地址
            template: "./src/detail.html",
            chunks: ['detail']
        })

? ? ? ? ?注意:html不可以热更新,只js可以

2、安装cross-env

? ? ? ? 安装:npm i -D html-webpack-plugin

? ? ? ? 配置:在package.json的 scripts 增加serve和build命令(根据自己习惯命名)

????????????????

        "build": "cross-env NODE_ENV=production webpack",
        "serve": "cross-env NODE_ENV=development webpack-dev-server"

3.安装clean-webpack-plugin

? ? ? ? 安装:npm?i -D?clean-webpack-plugin

? ? 配置:

const { CleanWebpackPlugin } = require('clean-webpack-plugin') // clean插件

...

new CleanWebpackPlugin()

第六步,配置babel

为了使代码能够兼容不同的浏览器,我们需要使用babel工具(与webpack结合一起使用)

安装:npm i -D @babel/core @babel/preset-env babel-loader core-js

? ? ? ?????????

       @babel/core:babel的核心工具

    @babel/preset-env:babel的预设环境

    babel-loader:babel与webpack结合的工具

    core-js:模拟js运行环境,使老版本的浏览器支持新版es语法(比如Promise在ie11中不支持,添加            corejs配置会引入corejs中封装的Promise)

配置:

{
            loader: 'babel-loader', // 指定加载器
            // 设置babel
            options: {
              // 设置预定义的环境
              presets: [
                [
                  '@babel/preset-env', // 指定环境的插件
                  // 配置信息
                  {
                    targets: { chrome: 58, ie: 11 }, // 要兼容的目标浏览器及版本(ie11不支持es6语法,写上 ie: 11 打包时就会编译成支持到ie11)
                    corejs: 3, // 指定corejs的版本(根据package.json中的版本,只写整数)
                    useBuiltIns: 'usage' // 使用corejs的方式,'usage'表示按需加载
                  }
                ]
              ]
            }
          },

此时,打包后的代码就支持到Chrome58和ie11了。

    注意:ie11不支持es6,如果使用了Promise,则需要引入corejs,它会将自带的封装好的Promise打包到最终的bundle.js中,使用corejs时将useBuiltIns设置为'usage'则为按需引入

最终的webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
module.exports = {
    // mode: 'production',
    mode: 'development',
    // entry: './src/index.ts', // 指定入口文件
    entry: {
        index: './src/index.ts',
        detail: './src/detail.ts'
    },
    output: {
        path: path.resolve(__dirname, 'dist'), // 指定打包文件的目录
        filename: '[name].js' // 打包后文件的名称
    },
    // 指定webpack打包时要使用的模块
    module: {
        // 指定loader加载的规则
        rules: [{
            test: /\.ts$/, // 指定规则生效的文件:以ts结尾的文件
            // use: 'ts-loader', // 要使用的loader
            // ts先由ts-loader转换成js文件,再由babel中target指定的浏览器版本,将js转成对应的语法。配置了babel后不需要考虑使用es5还是es6的版本了,在target中指定了需要兼容的浏览器版本,babel会自动帮我们转
            use: [{
                    loader: 'babel-loader', // 指定加载器
                    // 设置babel
                    options: {
                        // 设置预定义的环境
                        presets: [
                            [
                                '@babel/preset-env', // 指定环境的插件
                                // 配置信息
                                {
                                    targets: { chrome: 58, ie: 11 }, // 要兼容的目标浏览器及版本(ie11不支持es6语法,写上 ie: 11 打包时就会编译成支持到ie11)
                                    corejs: 3, // 指定corejs的版本(根据package.json中的版本,只写整数)
                                    useBuiltIns: 'usage' // 使用corejs的方式,'usage'表示按需加载
                                }
                            ]
                        ]
                    }
                },
                'ts-loader'
            ],
            exclude: /node-modules/ // 要排除的文件
        }]
    }, // 设置哪些文件类型可以作为模块被引用
    resolve: {
        extensions: ['.ts', '.js']
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            // title: "哈哈哈哈",
            // 复制出来的html文件,会默认引入js代码
            filename: "index.html",
            // 要处理的html文件地址
            template: "./src/index.html",
            chunks: ['index']
        }),
        new HtmlWebpackPlugin({
            // title: "哈哈哈哈",
            // 复制出来的html文件,会默认引入js代码
            filename: "detail.html",
            // 要处理的html文件地址
            template: "./src/detail.html",
            chunks: ['detail']
        })
    ]
}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:04:44  更:2022-03-11 22:08:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:46:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码