npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue_stage_1.0

v1.0.0

Published

vue编译工具

Downloads

77

Readme

我写的主要记录vue webpack 搭建和优化的全过程

#step.1 npm init 项目名称初始化

#step.2

##准备工作

  • 需要使用的插件
 npm i webpack -D // 我们需要的工具
 npm i webpack-cli -D // 工具辅助的命令
 npm i clean-webpack-plugin -D //文件清理工具
 npm i html-webpack-plugin -D //html 模版工具 
 /*
 各种需要的loader: 需要处理 css scss style img file html vue 等。我更加倾向选择功能全的 loader 简单的配置办更多的事情
 npm i css-loader postcss-loader vue-loader vue-template-compiler -d
 */

在安装 vue-loader 时候需要注意 每个 vue 包的新版本发布时,一个相应版本的 vue-template-compiler 也会随之发布。编译器的版本必须和基本的 vue 包保持同步,这样 vue-loader 就会生成兼容运行时的代码。这意味着你每次升级项目中的 vue 包时,也应该匹配升级 vue-template-compiler。

4.0以上版本都需要按照

  • vue项目常用依赖 vue vue-router

#step.3

我是在 .bin目录下面放的配置文件,这样的好处是让项目变的更加清晰

#step.4

接下来在package.json中添加配置 "start": "webpack --config webpack.config.js"

#step.5 上面的一切配置ok之后就可以开始根据实际的情况进行webpack的编写,我这次写的是一个vue的项目,因为我的目录习惯于是我建立了src这个文件里面是关于vue的全部目录。

#step.6 webpack.config.js 配置 // 我的规划分为 base dev / build

  1. 首先就是文件的输入
  2. 然后是文件的输出
  3. 每次build 时候记得清理 dist
  4. 开发环境 webpack 中有几个不同的选项,可以帮助你在代码发生变化后自动编译代码: webpack's Watch Mode webpack-dev-server webpack-dev-middleware
    使用 webpack-dev-server 配置很简单 如果配置ok了总是报错 可以看下 host 是不是 127.0.0.1 写到此时大家可以看下我的js代码

开发环境

 "start": "webpack-dev-server --open  --config .bin/webpack.config.js",
 下面是目前完整的代码 devServer 主要是一个更完美的配置,让你对项目有更多的掌控,如果不配置也是可以使用的 但是我们简单的进行配置下
``` js

const path = require('path'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const autoprefixer = require('autoprefixer'); module.exports = {
entry: './src/app.js', output: { filename: './js/app.js', path: path.resolve(__dirname, '../dist') }, mode:'development', module:{ rules:[ { test:/.vue$/, use:[ { loader: 'vue-loader' } ] } ] }, plugins:[ new HtmlWebpackPlugin({ title:"vue_stage", template:'./src/index.html' }), new CleanWebpackPlugin(), new VueLoaderPlugin() ], devServer:{ contentBase: './dist', hot: true } }; ``` 这样可以基本的跑起一个vue的项目来了,接下来一边对脚手架开发的探讨,其次是在我们的脚手架里面增加各种功能 各种loader的配置和功能的添加,让我们的工具变的更加完美。

模块热替换

这个功能可以很快的提高我们的开发效率,主要就是更新 webpack-dev-server,然后使用webpack 内置的HMR插件 这里插一个题外话 loader现在的写法有很多种,大体可以用的是

  • 第一种
{
   test:/\.vue$/,
   use:['vue-loader']
}
  • 第二种
{
   test:/\.vue$/,
   use:[
       {
       loader: 'vue-loader'
       }
   ]
}

样式管理

我们前端最重要的是啥,样式,对这很重要所以接下来是关于样式的配置 这个环境很重要,它涉及到了 scss 和 各个浏览器的兼容行 因为我们现在前端开发大部门是使用 scss/less/css 所以需要他们的loader

  1. node-sass是解析sass和scss=>css的基础,webpack中的sass-loader依赖于node-sass 当我们使用这些loader的时候 记得下载node-sass
{
        test: /\.(sa|sc|c)ss$/,
        use: ['style-loader','css-loader','postcss-loader', 'sass-loader']
}

因为我们使用了 postcss-loader 所以在使用的时候要在根目录添加一个它的配置 postcss.config.js 用来配置这个loader 可以有效的减少 css生成之后的体积。 下面是有样式管理的完整代码

const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {    
  entry: './src/app.js',
  output: {
    filename: './js/app.js',
    path: path.resolve(__dirname, '../dist')
  },
  mode:'development',
  module:{
      rules:[
            {
                test: /\.(sa|sc|c)ss$/,
                use: ['style-loader','css-loader','postcss-loader', 'sass-loader']
            },  
            {
                test:/\.vue$/,
                use:[ 'vue-loader']
            }
      ]
  },
  plugins:[
      new HtmlWebpackPlugin({
          title:"vue_stage",
          template:'./src/index.html'
      }),     
      new VueLoaderPlugin()
  ]
};

style-loader 的作用是抽离 .vue 中 标签里面的代码,并且要把它放到首位,这样我们在开发过程中样式的编辑基本就完成了

css文件抽离 (打包用)

写到这里我们打包的css仅仅只有一个js文件,这样会造成一个冗余,我们要想办法把css抽离出来,我选用的插件是 MiniCssExtractPlugin,它是支持webpack4.3+的, 见代码

 {
    test: /\.(sa|sc|c)ss$/,
    use: [        
        {
            loader: MiniCssExtractPlugin.loader,
            options: {                        
            publicPath: '../',
            hmr: false,
            reloadAll:true
            },
        },  
        'css-loader',
        'postcss-loader',
        'sass-loader'
        
    ]
}
new MiniCssExtractPlugin({
    filename: './css/[name].css',
    chunkFilename: '[id].css',
})

这样我们打包出一个main.css,接下来我们要做的是css文件的同类提取,和代码压缩

optimize-css-assets-webpack-plugin 这个插件可以用于压缩和去重

 new optimizeCss()

postcss.config 配置

当css样式代码被压缩之后,我们需要让我们写的代码有更好的兼容性 在配置 postcss.config.js 时候注意我们 autoprefixer 的版本,我这个项目的版本 9.6.1要把 autoprefixer 改成 overrideBrowserslist,

打包日志

我们要给我们的每个 css 文件加一个时间戳 new webpack.BannerPlugin('Build time : '+new Date().toString())

目前我们完成了 css 的开发 和 打包 配置,接下来主要是 js的 这两方面配置。

js 管理

做到这里很有意思,我们 js并没有1行代码,而我们前面的例子中我们打包的app.js 文件确有 97kb 天啊,这是多么可怕的一件事。不要担心我们慢慢来。 在没有做任何js配置的时候 我们的项目是可以正常运行的,这是一件高兴的事情,我们在 script 标签内尝试 引用外部的 css scss 等文件都是可以的 这是因为 vue-loader 的作用。 但是目前很多浏览器对js并不能很好的支持, 所以我们要在这方面做一些文章,它们主要表现在打包的过程中,其中之一就是 es6 语法的 转换,到现在为止。我们面对的是两个问题 重复js 代码的抽离 ,公共资源的抽离。

buildCongfig.optimization = {
    splitChunks:{
        chunks: "all",
        minSize:0,
        minChunks:1
    }
};

在其中使用插件 例如 css压缩 和去除代码中的console

minimizer:[
    new optimizeCss(),
    new UglifyJsPlugin({
        test: /\.js(\?.*)?$/i,
        sourceMap: true,
        uglifyOptions:{
            compress: {
                drop_console: true,
                drop_debugger: true, 
            },
        }
    })
],

从webpack4开始官方移除了commonchunk插件,改用了optimization属性进行更加灵活的配置。 optimization是webpack4新增的,主要是用来让开发者根据需要自定义一些优化构建打包的策略配置, 关于 splitchunksPlugin 的介绍

splitChunks: {
    chunks: "async”,//默认作用于异步chunk,值为all/initial/async/function(chunk),值为function时第一个参数为遍历所有入口chunk时的chunk模块,chunk._modules为chunk所有依赖的模块,通过chunk的名字和所有依赖模块的resource可以自由配置,会抽取所有满足条件chunk的公有模块,以及模块的所有依赖模块,包括css
    minSize: 30000,  //表示在压缩前的最小模块大小,默认值是30kb
    minChunks: 1,  // 表示被引用次数,默认为1;
    maxAsyncRequests: 5,  //所有异步请求不得超过5个
    maxInitialRequests: 3,  //初始话并行请求不得超过3个
   automaticNameDelimiter:'~',//名称分隔符,默认是~
    name: true,  //打包后的名称,默认是chunk的名字通过分隔符(默认是~)分隔
    cacheGroups: { //设置缓存组用来抽取满足不同规则的chunk,下面以生成common为例
       common: {
         name: 'common',  //抽取的chunk的名字
         chunks(chunk) { //同外层的参数配置,覆盖外层的chunks,以chunk为维度进行抽取
         },
         test(module, chunks) {  //可以为字符串,正则表达式,函数,以module为维度进行抽取,只要是满足条件的module都会被抽取到该common的chunk中,为函数时第一个参数是遍历到的每一个模块,第二个参数是每一个引用到该模块的chunks数组。自己尝试过程中发现不能提取出css,待进一步验证。
         },
        priority: 10,  //优先级,一个chunk很可能满足多个缓存组,会被抽取到优先级高的缓存组中
       minChunks: 2,  //最少被几个chunk引用
       reuseExistingChunk: true,//  如果该chunk中引用了已经被抽取的chunk,直接引用该chunk,不会重复打包代码
       enforce: true  // 如果cacheGroup中没有设置minSize,则据此判断是否使用上层的minSize,true:则使用0,false:使用上层minSize
       }
    }
}

splitChunks 的详细介绍可以参考另一篇 学习文章 splitChunks https://www.codercto.com/a/24308.html 通过配置 optimization.minimize true/false 我们可以查看我们的代码是否压缩,为了更好的方便查看我们代码打包的内容我们选择不压缩。 首先我们要去除 我们的无效代码 这里我借助的是 其次是 babel 如果我们开发环境只需要 chrome 为了让webpack运转如飞,我们就不需要配置 babel,只需要在打包的过程中配置好就行了 这里需要准备的是

npm i @babel/core   @babel/preset-env abel-loader -D

之后 在 babelrc 进行一下定植后的配置就好了

图片,视频 ,svg 的处理

这里我先描述一下 vue-loader 的作用

vue-loader是webpack的一个loader,用于处理.vue文件。 .vue 文件是一个自定义的文件类型,用类 HTML 语法描述一个 Vue 组件。每个 .vue 文件包含三种类型的顶级语言块 。 vue-loader 会解析文件,提取每个语言块,如有必要会通过其它 loader 处理(比如默认用babel-loader处理,默认用style-loader处理),最后将他们组装成一个 CommonJS 模块,module.exports 出一个 Vue.js 组件对象。

关于js部分的管理,我把它分为两个部分,其中一个 js 兼容问题,另一个是公共代码。 公共代码 https://blog.csdn.net/qq_17175013/article/details/87024522 js兼容问题

ts模块

优化

前面的步骤,基本就完成了vue webpack的基本配置,但是我们怎么能把webpack的性能开到最大呢

upd:更新某功能(不是 feat, 不是 fix) feat:新功能(feature) fix:修补bug docs:文档(documentation) style: 格式(不影响代码运行的变动) refactor:重构(即不是新增功能,也不是修改bug的代码变动) test:增加测试 chore:构建过程或辅助工具的变动 git commit -m 'feat: 增加 xxx 功能' git commit -m 'bug: 修复 xxx 功能'

代码引入自动识别

  resolve: {
    extensions: ['.js', '.vue', '.json', '.ts'],
    alias: {
      '@': resolve('src')
    }
  }