首页 > 其他分享 >webpack功能

webpack功能

时间:2024-11-27 19:56:31浏览次数:6  
标签:文件 功能 vue js webpack 打包 css

webpack功能

1. 配置全局变量

使用webpack自带的 providePlugin, 可以配置全局变量.

{
     plugins: [
        new webpack.ProvidePlugin({
            $: 'jquery',
            jQuery: "jquery",
        })
    ]
}

2. 多入口打包

多入口打包,就是打包的文件, 不止有index.html一个入口,而是多个. 比如login.html.那么就需要

  1. 在plugins中用HtmlWebpackPlugin创建多个入口
  2. 打包的js文件也不能打包在一个文件中, 一个入口的文件,不需要其他入口文件打代码.所以在entry里配置多个入口
  3. 在 HtmlWebpackPlugin的chunks里配置入口html文件要加载的js模块.

module.exports = {
    mode: 'development',
    entry: {
        // 多入口打包
        index: "./src/index.js",
        login: "./src/login.js",
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'index.html', // 最后再dist里生成的入口文件, 如果写 a.html的话, 在dist里就不是index.html, 而是a.html了
            template: './src/index.html',
            // 当前打包入口 加载的js模块, 这里的模块名是 entry里面的key对应的模块
            chunks: ['index'],
        }),
        new HtmlWebpackPlugin({
            filename: 'login.html', 
            template: './src/login.html',
            chunks: ['login'],
        }),
    ]
}

3. 图片打包

webpack自带文件处理插件. 用type: 'asset',配置.

{
    module: {
        rules: [
            {
                test: /\.(png|jpg|jpeg|svg)$/i,
                type: 'asset',
                parser: {
                    dataUrlCondition: {
                        maxSize: 1 * 1024,
                    }
                },
                generator: {
                    // 图片文件都 创建到 img文件夹下,  名称格式: 原名.6位hash.图片后缀.  
                    // 带hash是为了防止不同文件夹下面有同名文件.现在放到 img文件夹下面了.为了区分加个hash
                    filename: 'img/[name].[hash:6][ext]',
                }
            }
        ]
    },
}

4. 开发模式的本地服务器.

这里的文档我看了, 可以看懂

在有dev-server之前的开发情况

  1. 在源文件修改后, 执行npm run build, 打包生成dist打包文件.
  2. 在dist/index.html用"open with live server"打开, 查看修改内容
    问题:
  3. 每一次修改都得手动build一下, 才能看到, 非常麻烦.
    解决方案:
  4. 用webpack-dev-server开启一个服务器, 针对src里的源文件做监控, 当文件变化后, 自动build打包成dist. 然后用服务器打开dist/index.html.

webpack-dev-server实际上是, 把开发代码,打包到dist,
然后在dist目录中, 以dist为根目录,启动服务器, 打开了index.html文件.
实际效果跟在vscode中, 右键点击dist/index.html,选择 open with live server 是一样的.

所谓的开发模式, 就是

  1. 以dist为根目录,启动服务器, 打开dist/index.html文件.
  2. 当源码文件有变化时,就打包一次. 更新dist里的文件代码
  3. hot热更新模式,就是当监控到文件变化时, 主动更新浏览器.刷新浏览器,或dom结构.
  4. 关于图片文件.在源码中路径是./img/login/icon.png,由于打包后统一放到了dist/img下面, 所以应该是看不到图片的,此时图片的真实地址是http://localhost:9080/img/19.77aff4.jpg
  5. 为了解决问题4, 使用了 CopyWebpackPlugin,该插件会把图片的完整路径,复制一份到dist下面,
    这样dev-server就能找打对应的文件了. 同时这份文件只是为了开发, 所以只存在于内存中. 实际在dist下面看不到.
  6. 到最后,不是开发命令而是 在执行打包命令时, 因为实际的图片都打包在dist/img里, 所以后面会在打包时,把所有的引入img的路径,改成从dist/img里面拿图片.

备注:

  1. copy-webpack-plugin的文档 https://www.webpackjs.com/plugins/copy-webpack-plugin/
  2. dev-server的文档 https://www.webpackjs.com/configuration/dev-server/#devserver
{
    devServe:{
        // 打包文件路径
        static: './dist',
        server: 'http', // 启动的服务式http
        port: 9080, // 端口好
        https: false, // 是否使用https
        hot: true, // 热更新
        open: true, // 是否自动打开浏览器
        proxy: { // 代理
            '/api': 'http://localhost:3000',
        },
        watchFiles: ['src/**/*.php', 'public/**/*'], // 监听文件变化范围.
        webSocketServer: 'ws', //使用web-socket服务器
    },
    plugins: [
        // 复制开发文件到, 打包文件的插件.
        new CopyPlugin({
            patterns: [
                {
                    from: path.resolve(__dirname, './src/img'),
                    to: path.resolve(__dirname, './dist/img'),
                }
            ]
        })
    ]

}

5. css抽离

使用style-loader, css-loader的问题

  1. 当前对css的处理是在用css-loader获取到css文件后, 用style-loader,创建一个函数, 函数效果是 直接在html上插入一个style标签. 把css内容写入这个style标签里.
  2. 这个函数会被打包到index.js里, 在index.html启动后执行.
  3. 这样的话, 所有的css文件都会在index.js里.会使index.js过于膨胀.也不方便对css进行压缩. 不符合我们对js分门别类的需求.
  4. 所以我们打算把所有的css文件都打包到一个css文件夹中.

使用MiniCssExtractPlugin把css单独打包. 把css从index.js文件冲抽离出来.

  1. npm install --save-dev mini-css-extract-plugin
  2. 使用miniCss自带的MiniCssExtractPlugin.loader,代替style-loader获取css内容
  3. 在plugins里配置.css文件打包的路径.

效果:
未抽离css时, login.js为: 9.2kb. 抽离后变成了 login.js: 3.1kb, login.css: 5.9kb.

const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
    module: {
        rules: [
        {
            test: /\.css$/i,
            // 使用minicss的loader获取到css的内容chunk
            use: [MiniCssExtractPlugin.loader, "css-loader"],
        },
        ],
    },
    plugins: [
        // 把css内容打包到 dist/css下.
        new MiniCssExtractPlugin({
            filename: 'css/[name].[hash:6].css',
            chunkFilename: 'css/[name].css',
        })
  ],
};

备注: https://www.webpackjs.com/plugins/mini-css-extract-plugin/

6. js代码压缩

问题: 打包后的js文件太大.
解决方案: js压缩
npm install terser-webpack-plugin --save-dev

treeshaking, lodash-es替换lodash

7. css,js代码压缩

问题: 打包后的文件太大.
解决方案:

  1. css压缩, 使用CssMinimizerWebpackPlugin压缩css,
  2. 使用terser-webpack-plugin压缩js. 注意视频里说用uglifyjs-webpack-plugin,但是这个插件式webpack4版本的, webpack5已经没有了, 应该是版本更新去掉了. 到webpack的插件列表里找,找到了替代品terser-webpack-plugin.
const MiniCssExtractPlugin = require("mini-css-extract-plugin") // css解析插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); // css压缩插件

{
    // 优化配置项
    optimization: {
        minimize: true, // 是否压缩
        minimizer: [
            //js压缩插件
            new TerserPlugin({}),
            //css压缩插件
            new CssMinimizerPlugin(),
        ]
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    // css解析器用 MiniCssExtractPlugin.loader
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                ]
            },
        ]
    }
}

8. treeshaking 不打包未使用的函数

tree,树, shaking摇动, treeshaking摇动树木, 把不用的叶子摇晃下来. 意为打包时不打包没有使用过的函数代码

以lodash为例

  1. 比如只使用了lodash里面的deepClone函数, 但却打包了lodash的所有的代码. 这肯定是不划算的. 如果是把deepClone打包进入,不打包lodash的其他代码.就很好的压缩了文件大小.这就是treeshaking.
  2. 不加lodash,打包后的index.js有167kb
  3. 使用import _ from 'lodash'的方式使用_.get的index.js有 279kb
  4. 使用treeShaking方式使用get函数的index.js有170kb,可见treeShaking有多么必要

使用treeshaking有几个条件

  1. 用解构方式获取函数import { get } from 'lodash'
  2. lodash必须符合esModule规范. 也就是用如下方式导出函数. 不能用module.export.
export function get() {
    ...
}

// 这是lodash的lodash.js的函数导出方式. 定义了一个lodash对象. 然后在lodash对象上加各种函数,再把lodash对象导出.
    lodash.add = add;
    lodash.attempt = attempt;
    lodash.camelCase = camelCase;
    lodash.capitalize = capitalize;
    lodash.ceil = ceil;
    lodash.clamp = clamp;
    lodash.clone = clone;
    lodash.cloneDeep = cloneDeep;
  1. lodash不符合esModule规范,所以treeShaking不生效. 要使用符合esModule规范的lodash-es才行.
import { get } from 'lodash-es';
  1. 即使函数都在同一个文件,也可以被treeshaking去掉, 条件是 webpack.config.js里的配置的mode改成生产模式. mode=production
  2. 一定要用解构赋值来获取函数, 这样就可以保证工具函数是esModule的写法(因为导出对象的方式没法用解构来获取函数.),
export function get(){}

import { get } from 'tools';

// lodash-es的lodash.js文件的导出方式., 直接用export把各个函数导出.
export { default as add } from './add.js';
export { default as after } from './after.js';
export { default as ary } from './ary.js';
export { default as assign } from './assign.js';
export { default as assignIn } from './assignIn.js';
export { default as assignInWith } from './assignInWith.js';

9. splitChunk 打包文件 index.js的分割

目前, 所有的js文件, 包括自己的和node_module的,全都打包在了一个文件index.js中.
包括: jquery, lodash, jquery-flexslider, 一共1.6M.这就很大. 所以现在我们要分割这个文件

注意: 通俗的讲,"chunks" 是指交给webpack处理的文件,例如:js/css/img文件,node_module里导入的插件. 通过import的方式引入的模块或文件都可以称之为"chunks"。

  1. 把自己项目的业务js文件和node_module的插件文件分离. 因为node_module里是插件, 一个模块不会依赖其他模块. 相对好分割. 但是自己的业务文件. 由于有依赖关系不好分割.
    所以 先把业务文件和插件文件分割.

  2. 分割是有最小粒度的, 每一个被import导入的资源,库,组件都是一个chunk. 只能是不同chunk之间进行组合.一个chunk不能分割成两个文件.

  3. optimization.splitChunks配置分割方式. 这里的配置项更像是分析配置. 简单来说就是先打包成一个文件index.js. 然后, 如果某些chunk单独打包出来符合配置的条件.就会把他单独打包出来.否则就合并到同一的index.js里

    1. chunks: 要分析的类型.

      • initial 就是从webpack.config.jsentry属性里多入口分离的文件.也就是业务组件. 比如
      {
          entry: {
              index: "./src/index.js",
              login: "./src/login.js",
          },
      }
      

      splitChunks配置的属性就会对业务模块的代码进行分割

      • async 应该是从node_module里导入的模块的分割(不确定).
      • all 将业务代码和node_module里的代码进行分割. 就是index.js里只有业务代码. node_module里的工具代码单独打包一个文件(或多个文件).
      • chunks的类型的效果受minSize影响. 达到minsize大小了,才会单独作为一个包. 没有达到则还是都在index.js里.
    2. minSize: 10 * 1024, 单位bite, 10 * 1024就是10kb. 这里的minSize是如果某个chunk打包后有10kb则会被单独打包, 否则就放到index.js里,哪怕index.js已经很大了.也是如此. 也就是说大文件单独作为一个chunk, 小文件都打包到index.js里.

    3. name: 打包后的文件名,可以是函数. 如果是多入口项目(比如login, index). 目前name的函数里没有entry, 无法区分具体是哪个入口. 所以可以直接用默认的名字.

      1. 默认名称是由打包的文件名拼接而成的.比如里面有juqry和lodash, 那名字里就是vendors-node_modules_jquery_-node_modules_lodash_lodash_js.540af9.js
      2. 如果login和index拆出来的splitChunks文件的构成一样.比如都是juqry和lodash, 那么名字就是会一样. 但是没关系,因为里面内容也一样.
    4. cacheGroups: 分组打包, 单独打包一个jquery, test模块名匹配,name打包后的名称.chunks类型.

          jquery: {
                  test: /jquery\.js/,
                  name: 'jquery',
                  chunks: 'all',
              },
      
    5. 一般来说minSize可以设为300kb, 注意这里的300kb是在生产环境下压缩后的文件大小,不是开发环境的文件大小.

{
optimization: {
        splitChunks: {
            chunks: 'all',
            minSize: 1 * 1024,
            name: 'common',
            cacheGroups: {              
                jquery: {
                    test: /jquery\.js/,
                    name: 'jquery',
                    chunks: 'all',
                },
                'lodash-es': {
                    name: 'lodash-es',
                    test: /lodash-es/,
                    chunks: 'all',
                }
            }
        },
    },
}

10. ejs 原始项目的公共模板

  1. 下载ejs, ejs-loader
npm i ejs
npm i ejs-loader -D
  1. 配置ejs-loader
    module: {
        rules: [
            {
                test: /\.ejs$/i,
                loader: 'ejs-loader',
                options: {
                    esModule: false,
                }
            }
        ]
    },

  1. 创建ejs文件
    创建src/ejs/header.ejs文件
<p class="fl">
    <a href="login.html" id="login">登录</a>
    <a href="#" id="reg">注册</a>
</p>
  1. 使用ejs文件
<body>
    <!-- 函数参数里可以传递数据 -->
    <%= require('./ejs/header.ejs')() %>
</body>

11. clean 每次打包后都清空dist

在webpack5, clean-webpack-plugin已经被集成到了webpack里,成了默认插件了. 可以直接用webpack.config.js里的配置控制

module.exports = {
  //...
  output: {
    clean: true, // 在生成文件之前清空 output 目录
  },
};

12. copy-webpack-plugin, 将源文件中的某些文件直接复制到dist包中.

适用范围:

  1. 比如说有些静态文件. 并不被html文件引用. 而是可以直接在浏览器查看, 单独占一个地址. 比如一些pdf文件(同意协议, 法律条文),
  2. 这些文件由于不被html引用, 所以不会被webpack处理, 也就不会直接出现在dist目录中.
  3. 又不能每次都手动复制过去, 所以有了 copy-webpack-plugin, 帮我们把这些文件直接复制到dist里面.
  4. 配置:
const CopyPlugin = require("copy-webpack-plugin");
{
    plugins: [
        new CopyPlugin({
            patterns: [
                {
                    from: path.resolve(rootPath, "./src/static"),
                    to: path.resolve(rootPath, './dist/txt'),
                }
            ]
        })
    ]
}

13. vue-loader, @vue/compiler-sfc , vue-template-compiler

  1. vue-loader: 识别.vue文件, 可以将.vue文件里的html, css, js识别出来. vue-loader@15版本以上的可以识别vue3代码
  2. @vue/compiler-sfc: 将vue-loader识别出来的html, css,js进行进一步处理, 生成vue组件.
  3. vue-template-compiler: 专门针对<template>标签进行处理. @vue/compiler-sfc可以对template,script, style所有标签都处理,但是没有vue-template-compiler专精.
  4. 在webpack配置中, 只用配置vue-loader, 另外两个 @vue/compiler-sfc , vue-template-compiler是vue-loader调用的, 只要存在就可以了.

vue-loader的使用

// 跟vue-loader配套使用的插件
const { VueLoaderPlugin } = require('vue-loader')

// webpack的配置
{
    module: {
        rules: [
            {
                // 此处没有ts的适配.只是识别vue文件. ts以后再说
                test: /\.vue$/,
                loader: 'vue-loader',
            }
        ]
    },
    plugins: [
        // vue-loader的配套插件
        new VueLoaderPlugin(),
    ]

}

14. devtools配置sourceMap

在浏览器看源代码
devtools: string

  1. eval: 只展示打包后的代码, 不展示源码
  2. "eval-source-map": 展示源代码. 此处没有管ts. ts的解析另说.
  3. 要在浏览器上看到自己的业务源代码, 最好是通过控制台console里的log,点击对应文件查看. 直接看source分不清哪个是哪个.

15. vue-router

  1. npm install vue-router@3 // npm install vue-router 默认的是vue-router@4, 4对应的是vue3, 不能用于vue2
  2. router.js
import Home from './page/home.vue';
import VueRouter  from 'vue-router';
import Vue from 'vue'

/*vue.use的用处
1. 创建router-link, router-view标签.
2. 注册 this.$router, this.$route 对象.
*/
Vue.use(VueRouter);

// 路由配置
const routes = [
    {
        path: "/",
        redirect: 'home',
    },
    {
        path: "/home",
        name: 'home',
        component: Home,
    }
]

// 创建router实例.配置其他参数.
const Router = new VueRouter({
    routes,
})

export default Router;
  1. 在main.js里注册router
import Vue from 'vue';
import App from "./App.vue";
import router from './router.js';
new Vue({
    router,
    render: h=> h(App)
}).$mount("#app");
  1. 在App.vue里使用router-view
  <template>
    <router-view></router-view>
</template>

16. mpa改造

当前的单页面应用只有index.html一个入口. 不利于搜索引擎识别页面内容. 对于页面在搜索引擎的排名不利. 为了对项目进行seo优化.
我们把项目改成多页面应用, 每一个页面都在dist里有一个对应的入口html文件.比如login.html, home.html
核心原则就是: 把每一个页面都当成一个项目去处理

  1. 每一个页面都有一个入口文件, 比如"src/mpa/home.js", "src/mpa/login.js"
import Vue from 'vue';
import home from "../page/home.vue";
new Vue({
    // 这里的home本来是app.vue但是现在由于只展示home组件,所以可以直接放home, 不再需要router.
    render: h=> h(home)
}).$mount("#app");
  1. 新建webpack.vue.mpa.config.js. 进行mpa的项目配置
    1. entry改成多个
   entry: {
        // 'index': path.resolve(rootPath, "./src/main.js"),
        'home': path.resolve(rootPath, "./src/mpa/home.js"),
        'login': path.resolve(rootPath, "./src/mpa/login.js"),
    },
2. HtmlWebpackPlugin配置多个, 在dist里生成多个html文件
        // 用index.html模板在dist下生成一个html文件
        new HtmlWebpackPlugin({
            filename: 'login.html', // 最后生成的login的入口文件
            template: path.resolve(rootPath, "./public/index.html"), // 模板用统一的模板
            // 当前打包入口 加载的js模块, 这里的模块名是 entry里面的key对应的模块
            chunks: ['login'],
        }),
  1. 修改package.json里的script,添加mpa命令
    "scripts": {
        "start:mpa": "webpack-dev-server --config ./build/webpack.vue.mpa.config.js",
        "build:mpa": "webpack --config ./build/webpack.vue.mpa.config.js"
    },

vue3改造

vue3比vue2更快, 更好用. 打包后体积更小, 反应更快. 并且vue2已经不在被支持,所以我们的vue2项目要升级到vue3.

  1. vue3: 3.4.38, vue-router: 4.4.3, vue-loader: 16.8.3, 在package.json里配置"vue": "^3.0.0",就会自己去找3版本的最新版本.
  2. vue-router的创建
import Home from './page/home.vue';
//createRouter创建router对象,  createMemoryHistory创建router的历史记录模式
import {createRouter, createMemoryHistory} from 'vue-router';
const routes = [

    {
        path: "/home",
        name: 'home',
        component: Home,
    },
];
const router = createRouter({
    history: createMemoryHistory(),
    routes,
})

export default router;
  1. vue的创建. main.js
import router from './router.js';
import App from "./App.vue";
import {createApp} from 'vue'
const app = createApp(App).use(router).mount("#app");
  1. vue3的语法和router的使用

import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
export default {
    setup() {
        const router = useRouter();
        const goLogin = () => {
            router.push('/login');
        };
        const message = ref('li');
        onMounted(() => {
            message.value = '李飞';
        });
        return {
            message,
            goLogin,
        };
    },
};

英语

  1. generator: 发电机, 发生器. 引申为创建含义, 创建文件的配置
  2. provider: 提供者, 供应者, 在webpack里是, 遇到未定义的变量 提供引入模块.
  3. optimize: 使...优化. optimization优化项. 使用webpack对打包的优化配置项.
  4. exclude: 排除, 不是用优化程序的文件目录.
  5. treeshaking: tree,树, shaking摇动, treeshaking摇动树木, 把不用的叶子摇晃下来. 意为打包时不打包没有使用过的函数代码

每个技术要搞懂的内容.

  1. 出现这个技术之前的现状是什么.
  2. 这个现状有什么问题, 这个技术是为了解决什么问题而出现的.
  3. 解决方案是什么.
  4. 解决后比原来好在哪里(选)

遇到的问题

  1. devServer配置不生效问题.
    问题:

    1. 在webpack.config.js里配置了 webpack-dev-server. port设为9000.
    2. 在package.json的script里配置了命令start: webpack-dev-server.
    3. 执行npm start后. port是8080.

    原因:

    1. webpack-dev-server命令中, 默认的webpack.config.js的位置实在根目录, 而我的是在'build'文件夹下. devserver没有找到配置文件,所以用的默认配置.所以port是8080. "build"命令配置了配置文件位置, 所以没有出问题

    解决方案:

    1. 修改start命令为: "start": "webpack-dev-server --config ./build/webpack.config.js",

性能优化

1. 多入口打包, js入口的分离.

每个入口只打包他们自己的文件, 而不是全部js文件. 详见 `9. splitChunk 打包文件 index.js的分割`; 

2. 入口文件优化.

index.js文件过大. 把index.js分割成多个大小适当的文件. 比如用`mini-css-extract-plugin`单独把css文件抽离出来(style-loader是把css内容直接打包到index.js里的.)

3. 代码压缩

js压缩:  terser-webpack-plugin , css代码压缩: css-minimizer-webpack-plugin;

4. treeshaking

未被调用的函数不打包进dist里. 比如用lodash里的工具函数, 用哪个就打包哪个,而不是整个打包进去. 常用的就那几个.
使用别的工具函数的时候,一定要用解构赋值来获取, 防止引入不必要的函数.

5. splitChunks

针对所有js文件打包成的index.js进行分割. 比如首屏优化. 在单页面应用中, 进入页面时是会把所有的公共js文件都加载的. 但是首页可能只用到很少的公共js库. 
这时可以把 "首页的业务文件", "首页用到的公共js文件"单独拉出来. 首页用不到的公共文件单独放一个文件.这样当进入页面时,首页的业务文件, 首页用的公共js文件加载完后页面就展示了. 首页用不到的公共文件还未返回时,不影响页面展示. 可以在后面慢慢请求.
        export function get(){}
        import { get } from 'tools';

标签:文件,功能,vue,js,webpack,打包,css
From: https://www.cnblogs.com/bridge7839/p/18572991

相关文章

  • 【Unity 插件】Lean Touch 快速创建基于触摸的交互功能,适合用于移动端游戏和应用开发
    LeanTouch是一款轻量级且功能强大的Unity插件,专门设计用于实现移动设备上的触摸输入控制,同时也支持鼠标输入。它能够帮助开发者快速创建基于触摸的交互功能,例如平移、缩放、旋转等操作,非常适合用于移动端游戏和应用开发。以下是其详细介绍:功能特点1.多点触控支持支持......
  • Burp suit安装以及常用功能介绍
    免责声明本文章仅供学习交流使用,旨在帮助广大安全爱好者提升技术水平和分享经验。文中所提到的任何工具、脚本、方法或案例,均用于合法范围内的网络安全学习与研究,禁止将其用于任何非法目的。请严格遵守相关法律法规,未经授权不得对他人系统进行测试或操作。任何因滥用文章内容......
  • 输液器正负压泄漏检测仪的功能及测试步骤
      在医疗行业中,输液器的密封性能直接关系到患者的安全和治疗效果。为了确保输液器在使用过程中的可靠性和安全性,国家标准化管理委员会发布了《YY/T0286.6-2020专用输液器第6部分:一次性使用刻度流量调节式输液器》标准。该标准为输液器的正负压泄漏检测提供了详细的技术规......
  • 自动化工具有很多,按照不同的应用场景和功能特点可以分为多个类别。以下是一些常见的自
    自动化工具有很多,按照不同的应用场景和功能特点可以分为多个类别。以下是一些常见的自动化工具,根据它们的使用场景和功能进行分类:1. 桌面自动化工具这些工具主要用于自动化桌面应用程序的操作,例如模拟鼠标点击、键盘输入、窗口管理等。Sikuli:基于图像识别的自动化工具,适用于......
  • Nuxt.js 应用中的 webpack:progress 事件钩子
    title:Nuxt.js应用中的webpack:progress事件钩子date:2024/11/27updated:2024/11/27author:cmdragonexcerpt:webpack:progress钩子用于监听Webpack在构建过程中的进度更新。这是一个非常有用的特性,特别是在构建大型应用时,可以给开发者实时反馈,以便他们知道构建的......
  • eGFR计算器,专业可靠的肾功能评估工具
    在当今数字化医疗时代,准确评估肾功能对于疾病预防和治疗至关重要。eGFR计算器作为一款专业的在线工具,为医疗工作者和患者提供了便捷可靠的肾小球滤过率(eGFR)计算服务。什么是eGFR?eGFR(估算的肾小球滤过率)是评估肾功能的重要医学指标。它通过测量每分钟肾小球过滤的血液量来反......
  • 带自动提示功能的jQuery标签输入插件
    这是一款带自动提示功能的jQuery标签输入插件。该插件可以指定一组预定义的标签,在输入某个关键字之后,便会提示出所有的可用标签供选择,非常方便。在线演示  下载 使用方法在页面中引入amsify.suggestags.css和amsify.suggestags.js文件。<linkrel="stylesheet"t......
  • deepin 技术双周报丨Treeland支持截图录屏功能、适配 wlroots 0.18 版本,6.12 内核完成
    第六期deepin技术双周报已出炉,我们会简单列出deepin各个小组在过去两周的相关工作进展,也会阐述未来两周的大致规划,一起来看!DDE针对deepin23的缺陷修复与deepin25的需求开发在同步稳步进行。具体进展与计划如下:进展:a.  对剪切板、DDE会话组件、DDEPolkit组件......
  • 如何高效开通Paddle账户、小额支付和支付宝功能?
    Paddle是一款覆盖范围广、费率透明的全球化支付平台,专为开发者和企业设计。无论是SaaS产品还是数字内容,Paddle都能帮助你轻松应对国际化支付挑战。通过这篇攻略,你将快速掌握如何高效开通Paddle账户并启用支付功能,为你的项目插上走向全球市场的翅膀!此外,Paddle提供的客制化......
  • 一个整合性、功能丰富的.NET网络通信框架
    前言最近有不少同学问:.NET网络通信框架有什么好推荐的吗?今天大姚给大家分享一款基于ApacheLicense开源的一个整合性、功能丰富的.NET(包括C#、VB.Net、F#)网络通信框架:TouchSocket。特色功能一键解决TCP黏分包问题,提供协议模板,支持快速实现固定包头、固定长度、区间字符......