最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 在小程序中愉快地写scss

    正文概述 掘金(酒阑人散)   2021-05-09   620

    问题点1:小程序每个页面都有一个wxss文件,所以webpack打包编译如何输出多个wxss文件

    wepback设置多入口配置,会对应输出多出口文件。 所以项目中有多少个scss文件,就对应多少个入口。

    1. app.json中定义了主包和分包的页面路径,直接遍历获取他们的目录名
    // pages and subPackages
    const { pages, subPackages } = appJson
    
    // 提取主包目录名
    // "pages/homeDelivery/index" => "pages/homeDelivery"
    // /[^/]+(?!.*\/)/ 把最后一个斜杠后的内容去掉
    const dirList = pages.map(page => page.replace(/[^/]+(?!.*\/)/, ''))
    
    // 提取分包目录名
    // "pages/paySuccess/index" => "fightGroups/pages/paySuccess/index" => "fightGroups/pages/paySuccess"
    subPackages.forEach(sub => {
      const { pages, root } = sub
      dirList.push(...pages.map(subPage => `${root}/${subPage}`.replace(/[^/]+(?!.*\/)/, '')))
    })
    

    再通过遍历目录下的文件获取所有scss/sass文件

    1. 再加上components组件目录,递归遍历此目录下所有文件,如果是scss/sass就返回

    2. 提取wxss文件: MiniCssExtractPlugin

    plugins: [
      // ...
      new MiniCssExtractPlugin({
        // 重新定义后缀名
        filename: '[name].wxss'
      })
    ]
    

    问题点2: webpack打包会默认输出一个 [name].js文件,但我们不需要

    FixStyleOnlyEntriesPlugin利用这个插件,会删除webpack打包出来的[name].js,并且不会影响原有的js文件

    问题点3:热更新

    开启webpack的watch功能

    watchOptions: {
      // 忽略除scss之外的所有文件,减轻监听压力
      ignored: [/node_modules/, '*.js', '*.css', '*.wxml', '*.wxss', '*.wxs', '*.json']
    },
    

    此时修改scss文件,就会重新打包编译,实现热更新。 提供两个shell命令,分别用于一次性构建和热更新

    "build": "cross-env build_type=buildOnce webpack --config webpack.config.js",
    "watch": "cross-env build_type=buildConstantly webpack --config webpack.config.js"
    

    问题点4:小程序的打包编译

    1. 添加.gitignore忽略node_modules
    2. project.config.json通过packOptions设置打包配置,我们需要忽略node_modules,webpack.config.js,package.json,package-lock.json
    3. project.config.json通过packOptions设置热更新,设置同上
    "packOptions": {
        "ignore": [
            {
                "type": "folder",
                "value": "node_modules"
            },
            {
                "type": "file",
                "value": "webpack.config.js"
            },
            {
                "type": "file",
                "value": "package.json"
            },
            {
                "type": "file",
                "value": "package-lock.json"
            }
        ]
    },
    "watchOptions": {
        "ignore": [
            "webpack.config.js",
            "package.json",
            "package-lock.json",
            "node_modules/**/**"
        ]
    },
    

    完整webpack配置

    const path = require('path')
    const fs = require('fs')
    const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    const FixStyleOnlyEntriesPlugin = require("webpack-fix-style-only-entries");
    const appJson = require('./app.json')
    
    const baseConfig = {
      mode: 'development',
      watch: process.env.build_type === 'buildConstantly',
      watchOptions: {
        // 忽略除scss之外的所有文件
        ignored: [/node_modules/, '*.js', '*.css', '*.wxml', '*.wxss', '*.wxs', '*.json']
      },
      module: {
        rules: [
          {
            test: /\.s(a|c)ss$/,
            use: [
              MiniCssExtractPlugin.loader, 'css-loader','sass-loader'
            ],
          }
        ],
      },
      plugins: [
        new FixStyleOnlyEntriesPlugin(),
        new MiniCssExtractPlugin({
          filename: '[name].wxss'
        })
      ]
    }
    
    const genExportInfo = (parseFileList) => {
      if (!parseFileList.length) return []
      return parseFileList.map(pathInfo => {
        return {
          entry: {
            index: path.resolve(__dirname, pathInfo),
          },
          output: {
            path: path.resolve(__dirname, path.dirname(pathInfo))
          },
          ...baseConfig,
        }
      })
    }
    
    /**
     * @desc 递归获取目录下的所有文件
     * @param {String} dir 指定目录路径
     * @param {RegExp} suffixReg 指定后缀名正则,/^.*$/表示匹配全通过
     * @param {Array} list 
     * @returns {Array} 返回文件路径
     */
    const recursiveFile = (dir, suffixReg = /^.*$/, list = []) => {
      const readList = fs.readdirSync(dir)
      readList.forEach(r => {
        const filePath = path.join(dir, r)
        if (fs.statSync(filePath).isFile()) {
          const fileSuffix = path.extname(filePath).slice(1)
          suffixReg.test(fileSuffix) && list.push(filePath)
        } else {
          recursiveFile(filePath, suffixReg, list)
        }
      })
      return list
    }
    
    /**
     * @desc css文件路径来源: app.json里的pages和subPackages,还有components
     */
    const genCssPathList = (appJson) => {
      // pages and subPackages
      const { pages, subPackages } = appJson
    
      // 提取主包目录名
      // "pages/homeDelivery/index" => "pages/homeDelivery"
      // /[^/]+(?!.*\/)/ 把最后一个斜杠后的内容去掉
      const dirList = pages.map(page => page.replace(/[^/]+(?!.*\/)/, ''))
    
      // 提取分包目录名
      // "pages/paySuccess/index" => "fightGroups/pages/paySuccess/index" => "fightGroups/pages/paySuccess"
      subPackages.forEach(sub => {
        const { pages, root } = sub
        dirList.push(...pages.map(subPage => `${root}/${subPage}`.replace(/[^/]+(?!.*\/)/, '')))
      })
    
      const needToParseList = []
    
      // 提取components所有文件
      needToParseList.push(...recursiveFile(path.resolve(__dirname, './components'), /s(a|c)ss/))
      
      dirList.forEach(dir => {
        needToParseList.push(...recursiveFile(path.resolve(__dirname, dir), /s(a|c)ss/))
      })
    
      return needToParseList
    }
    
    module.exports = genExportInfo(genCssPathList(appJson))
    
    

    起源地下载网 » 在小程序中愉快地写scss

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元