NEXT 中文文档地址!

  1. next.js 只有服务端使用的包需要做单独处理,无需打包到项目中,可以使用@zeit/next-bundle-analyzer观察代码。
  2. Router.beforePopState() 截断Router操作的设置只有在客户端生效(需在componentDidMount中设置)且进入此函数中的方法只有Router栈中有值的时候才可以!
  3. next.js 中设置绝对路径的方法是在next.config.js中wepack方法中的config参数增加配置。
  4. next.js 中配置自定义接口可以使用自定义启动参数,创建 server.js 通过 node server.js 启动。
  5. next.js 支持IE11和各主流浏览器 IE11以内的IE版本不支持。
  6. Link 标签passHref属性可以强制给子元素传递href属性,有利于SEO优化。
  7. windows 不支持 NODE_ENV=development的设置方式 导入 cross-env 然后运行时在前面添加 cross-env 即可解决。
  8. webpack 配置自定义的时候覆盖配置需要继承本有的配置,否则会使 next 解析错误(analysis error)。
    module.exports = {
    // ... other next.js config
    return {
    webpack: config => {
    config.resolve.alias = {
    ...(config.resolve.alias || {}),
    // custom webpack aliases
    }
    return config
    }
    }
    }
  9. null-loader 加载器的一个用途是关闭依赖项导入的模块。 例如,你的项目依赖于导入你不需要的polyfill的ES6库,因这里删除它将导致不会丢失功能。 测试polyfill的路径,它将不包含在你的包中。
  10. next.js 引入antd @zeit/next-css babel-plugin-import 按需加载无法正确编译css文件需要在next.config.js中配置服务端渲染方可。
    const withCss = require('@zeit/next-css')
    
    module.exports = withCss({
    webpack: (config, { isServer }) => {
    if (isServer) {
    const antStyles = /antd\/.*?\/style\/css.*?/
    const origExternals = [...config.externals]
    config.externals = [
    (context, request, callback) => {
    if (request.match(antStyles)) return callback()
    if (typeof origExternals[0] === 'function') {
    origExternals[0](context, request, callback)
    } else {
    callback()
    }
    },
    ...(typeof origExternals[0] === 'function' ? [] : origExternals),
    ] config.module.rules.unshift({
    test: antStyles,
    use: 'null-loader',
    })
    }
    return config
    },
    })
  11. next.js 引入@zeit/less需要将antd的按需加载style改为true。
  12. postCss/postCss-use 使用方法:
    module.exports = {
    plugins: [
    require('postcss-use')({
    // allow autoprefixer
    modules: [ 'autoprefixer' ]
    })
    ]
    }
  13. analysis && antd 3.x.x version icon 异步加载(next配置方案) && moment 语言包打包优化。
    moment 语言包使用 webpack.IgnorePlugin 会把所有语言过滤掉,所以需要使用 webpack.ContextReplacementPlugin 来指定打包筛选方案,然后单独引入所需moment语言包即可!

    const webpack = require('webpack')
    const withSass = require('@zeit/next-sass');
    const withBundleAnalyzer = require("@zeit/next-bundle-analyzer")
    module.exports = withBundleAnalyzer(withSass({
    analyzeServer: ["server", "both"].includes(process.env.BUNDLE_ANALYZE),
    analyzeBrowser: ["browser", "both"].includes(process.env.BUNDLE_ANALYZE),
    bundleAnalyzerConfig: {
    server: {
    analyzerMode: 'static',
    reportFilename: '../../bundles/server.html'
    },
    browser: {
    analyzerMode: 'static',
    reportFilename: '../bundles/client.html'
    }
    },
    webpack: (config, { dev }) => {
    config.module.rules.push(
    {
    test: /\.(ttf|eot|svg|png|jpg|gif|ico)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
    loader: 'file-loader',
    options: {
    name: '../../../[path][name].[ext]'
    }
    }, {
    test: /\.(css|scss)/,
    loader: 'emit-file-loader',
    options: {
    name: 'dist/[path][name].[ext]'
    }
    }, {
    test: /\.css$/,
    use: ['babel-loader', 'raw-loader', 'postcss-loader']
    }
    //, {
    // test: /\.s(a|c)ss$/,
    // use: ['babel-loader', 'raw-loader', 'postcss-loader',
    // {
    // loader: 'sass-loader',
    // options: {
    // includePaths: ['styles', 'node_modules']
    // .map((d) => path.join(__dirname, d))
    // .map((g) => glob.sync(g))
    // .reduce((a, c) => a.concat(c), [])
    // }
    // }
    // ]
    // }
    )
    !dev && config.module.rules.push({
    loader:'webpack-ant-icon-loader',
    enforce: 'pre',
    options:{
    chunkName:'antd-icons'
    },
    include: [
    require.resolve('@ant-design/icons/lib/dist.js')
    ]
    })
    !dev && config.plugins.push(
    // 阻止生成与正则表达式或过滤器函数匹配的模块import或require调用
    // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
    // 引入未知包的时候webpack会推断出directory的包,然后全部打包进入bundle,此条配置允许覆盖推断信息,更加精确的配置打包数据
    new webpack.ContextReplacementPlugin(
    /moment[\\\/]locale$/,
    /^\.\/(th)\.js$/
    )
    // 加到next/webpack.js配置中
    // new webpack.optimize.CommonsChunkPlugin({
    // // name: 'icons',
    // // filename: 'icons.js',
    // minChunks: function (module, count) {
    // if (dev || (module.resource && module.resource.includes('icons'))) {
    // return false;
    // }
    // }
    // }),
    )
    return config
    },
    // exportPathMap: function (defaultPathMap) {
    // return {
    // '/': { page: '/' },
    // }
    // }
    }))
  14. 针对低版本next使用的webpack3配置中使用webpack-icons-loader需要单独配置以及处理export之后的文件索引,方案为:
    var fs = require('fs')
    var path = require('path') function editWebpack (srcPath) {
    let prefix = path.extname(srcPath)
    // 过滤除js和html的文件
    if (prefix === '.js') {
    const data = fs.readFileSync(srcPath, 'utf8');
    let line = data.split('\n')
    let len = line.length
    let newLines = ''
    let isEdit = false for (let i = 0; i < len; i++) {
    if (i > 347 && i < 350) {
    let isFind = ~line[i].indexOf('(dev)')
    !isEdit && (isEdit = isFind)
    line[i] = isFind ? ' if (dev || (module.resource && module.resource.includes(\'icons\') && count >= 0)) {' : line[i]
    } newLines += line[i] + (i !== len - 1 ? '\n' : '')
    } fs.writeFileSync(srcPath, newLines, 'utf8');
    isEdit && console.log('webpack update success:' + srcPath + '\n')
    }
    } function editIcons (srcPath, tarPath) {
    let prefix = path.extname(srcPath)
    // 过滤除js和html的文件
    if (prefix === '.js') {
    const data = fs.readFileSync(srcPath, 'utf8'); fs.writeFileSync(tarPath, data, 'utf8')
    console.log('@ant-design update success:' + tarPath + '\n')
    }
    } editWebpack('./node_modules/next/dist/server/build/webpack.js')
    editIcons('./static/font/dist.js', './node_modules/@ant-design/icons/lib/dist.js')
    var fs = require('fs')
    var path = require('path') function findFolder (srcDir, tarDir) {
    // 读取当前路径下的所有目录和文件,返回字符串数组
    fs.readdir(srcDir, function (err, files) {
    files.forEach(function (file) {
    if (!~file.indexOf('antd-icons')) return
    var srcPath = path.join(srcDir, file)
    var tarPath = path.join(tarDir, file) fs.stat(srcPath, function (err, stats) {
    !stats.isDirectory() && copyFile(srcPath, tarPath)
    })
    }) })
    } function copyFile(srcPath, tarPath) {
    // 创建字节读取流
    var rs = fs.createReadStream(srcPath)
    rs.on('error', function (err) {
    if (err) {
    console.log('read error', srcPath)
    }
    }) // 创建字节写入流
    var ws = fs.createWriteStream(tarPath)
    ws.on('error', function (err) {
    if (err) {
    console.log('write error', tarPath)
    }
    })
    ws.on('close', function (ex) {
    }) rs.pipe(ws)
    console.log('ant-icons move success:' + srcPath + '\n')
    } findFolder('./.next/', './out/_next/webpack/')

Next.js 笔记的更多相关文章

  1. Data Visualization and D3.js 笔记(1)

    课程地址: https://classroom.udacity.com/courses/ud507 什么是数据可视化? 高效传达一个故事/概念,探索数据的pattern 通过颜色.尺寸.形式在视觉上表 ...

  2. js笔记-0

    #js笔记-0 数组: indexOf方法: Array也可以通过indexOf()来搜索一个指定的元素的位置: var arr = [10, 20, '30', 'xyz']; arr.indexO ...

  3. PPK谈JS笔记第一弹

    以下内容是读书笔记,再一次温习JS好书:PPK谈JS window.load=initializePageaddEventSimple('window','load',function(){}) lo ...

  4. 面向小白的JS笔记 - #Codecademy#学习笔记

    前言 最初浏览过<JavaScript秘密花园>,前一段时间读过一点点<JavaScript语言精粹>和一点点<JavaScript高级程序设计>(一点点是指都只是 ...

  5. require.js笔记

    笔记参考来源:阮一峰  http://www.ruanyifeng.com/blog/2012/10/javascript_module.html   1. 浏览器端的模块只能采用“异步加载”方式 = ...

  6. JS笔记 入门第四

    小测试: 注意:取消所有的设定可以直接使用 document.getElementById("txt").removeAttribute("style"); 这 ...

  7. JS笔记 入门第二

    输出内容 document.write(); alert("hello!"); alert(mynum); </script> 注:alert弹出消息对话框(包含一个确 ...

  8. Node.js笔记1

    Node.js入门笔记 1. node -help 可以显示帮助信息2. node REPL 模式(Read-eval-print loop) 输入—求值—输出循环 直接在cmd输入node 可以进入 ...

  9. JS笔记 入门第一

    WHY? 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. 3. 它可以让网页呈现 ...

  10. 奇舞js笔记——第0课——如何写好原生js代码

    摘要 1.好的代码职责要清晰,javscript不要用来操作样式: 2.API要设计的合理:通用性,适度的抽象(数据抽象,过程抽象),可扩展性: 3.效率问题:用好的.合适的算法(前端程序员要把自己当 ...

随机推荐

  1. sublime配置node开发环境

    下载node插件 https://github.com/tanepiper/SublimeText-Nodejs 下载zip压缩包后解压,文件名改为Node 打开文件“Nodejs.sublime-s ...

  2. Python内存机制简介

    1: 变量不是盒子,应该把变量视作便利贴.变量只不过是标注,所以无法阻止为对象贴上多个标注.标注就是别名: >>> a = [1, 2, 3] >>> b = a ...

  3. 一条SQL完成跨数据库实例Join查询

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  4. javaScript之split与join的区别

    共同点: split与join函数通常都是对字符或字符串的操作: 两者的区别: split() 用于分割字符串,返回一个数组,例如 var str="How are you doing to ...

  5. NSString&NSMutableString常用操作梳理

    http://www.cocoachina.com/ios/20150724/12722.html 上一篇梳理了NSArray&NSMutableArray常用操作,这次来梳理一下Object ...

  6. Java练习 SDUT-2445_小学数学

    小学数学 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 今年中秋节,大宝哥带着一盒月饼去看望小学数学老师.碰巧数学老师 ...

  7. Libevent:6辅助函数以及类型

    在头文件<event2/util.h>中定义了许多有用的函数和类型来帮助实现可移植的程序.Libevent在内部使用这些类型和函数. 一:基本类型 evutil_socket_t 除了Wi ...

  8. 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google

    摘要: 作为此次Gartner报告中唯一上榜的中国科技公司,阿里云获得六个评判维度的最高分,排名第二 近日,知名调研机构Gartner发布了全球领先公共云厂商区块链服务能力报告,作为唯一上榜的中国科技 ...

  9. call和apply用途与使用方法

    当你看代码时,经常会看到以下情形:(在这个博客里面,参数context是执行上下文的意思,params是参数的意思) Object.prototype.toString.call(context, p ...

  10. oracle trunc(d1[,c1])

    [功能]:返回日期d1所在期间(参数c1)的第一天日期 [参数]:d1日期型,c1为字符型(参数),c1默认为j(即当前日期) [参数表]:c1对应的参数表: 最近0点日期: 取消参数c1或j 最近的 ...